xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/misc/static-assert.cpp (revision 3af6ae0fbea40097e159c11893ee7ab57d00480c)
1 // RUN: %check_clang_tidy -std=c++11 -check-suffixes=,CXX11 %s misc-static-assert %t
2 // RUN: %check_clang_tidy -std=c++17-or-later -check-suffixes=,CXX17 %s misc-static-assert %t
3 
abort()4 void abort() {}
5 #ifdef NDEBUG
6 #define assert(x) 1
7 #else
8 #define assert(x)                                                              \
9   if (!(x))                                                                    \
10   abort()
11 #endif
12 
13 void print(...);
14 
15 #define ZERO_MACRO 0
16 
17 #define False false
18 #define FALSE 0
19 
20 #define my_macro() assert(0 == 1)
21 // CHECK-FIXES: #define my_macro() assert(0 == 1)
22 
23 namespace PR24066 {
24 
referenceMember()25 void referenceMember() {
26   struct {
27     int A;
28     int B;
29   } S;
30   assert(&S.B - &S.A == 1);
31 }
32 
33 const int X = 1;
referenceVariable()34 void referenceVariable() {
35   assert(X > 0);
36 }
37 
38 
39 constexpr int Y = 1;
referenceConstexprVariable()40 void referenceConstexprVariable() {
41   assert(Y > 0);
42   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
43   // CHECK-FIXES-CXX11: {{^  }}static_assert(Y > 0, "");
44   // CHECK-FIXES-CXX17: {{^  }}static_assert(Y > 0);
45 }
46 
useInSizeOf()47 void useInSizeOf() {
48   char a = 0;
49   assert(sizeof(a) == 1U);
50   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
51   // CHECK-FIXES-CXX11: {{^  }}static_assert(sizeof(a) == 1U, "");
52   // CHECK-FIXES-CXX17: {{^  }}static_assert(sizeof(a) == 1U);
53 }
54 
useInDecltype()55 void useInDecltype() {
56   char a = 0;
57   assert(static_cast<decltype(a)>(256) == 0);
58   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
59   // CHECK-FIXES-CXX11: {{^  }}static_assert(static_cast<decltype(a)>(256) == 0, "");
60   // CHECK-FIXES-CXX17: {{^  }}static_assert(static_cast<decltype(a)>(256) == 0);
61 }
62 
63 }
64 
myfunc(int a,int b)65 constexpr bool myfunc(int a, int b) { return a * b == 0; }
66 
67 typedef __SIZE_TYPE__ size_t;
68 extern "C" size_t strlen(const char *s);
69 
70 class A {
71 public:
method()72   bool method() { return true; }
73 };
74 
75 class B {
76 public:
method()77   constexpr bool method() { return true; }
78 };
79 
doSomething(T t)80 template <class T> void doSomething(T t) {
81   assert(myfunc(1, 2));
82   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
83   // CHECK-FIXES-CXX11: {{^  }}static_assert(myfunc(1, 2), "");
84   // CHECK-FIXES-CXX17: {{^  }}static_assert(myfunc(1, 2));
85 
86   assert(t.method());
87   // CHECK-FIXES: {{^  }}assert(t.method());
88 
89   assert(sizeof(T) == 123);
90 }
91 
main()92 int main() {
93   my_macro();
94   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
95   // CHECK-FIXES: {{^  }}my_macro();
96 
97   assert(myfunc(1, 2) && (3 == 4));
98   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
99   // CHECK-FIXES-CXX11: {{^  }}static_assert(myfunc(1, 2) && (3 == 4), "");
100   // CHECK-FIXES-CXX17: {{^  }}static_assert(myfunc(1, 2) && (3 == 4));
101 
102   int x = 1;
103   assert(x == 0);
104   // CHECK-FIXES: {{^  }}assert(x == 0);
105 
106   A a;
107   B b;
108 
109   doSomething<A>(a);
110   doSomething<B>(b);
111 
112   assert(false);
113   // CHECK-FIXES: {{^  }}assert(false);
114 
115   assert(False);
116   // CHECK-FIXES: {{^  }}assert(False);
117   assert(FALSE);
118   // CHECK-FIXES: {{^  }}assert(FALSE);
119 
120   assert(ZERO_MACRO);
121   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
122   // CHECK-FIXES-CXX11: {{^  }}static_assert(ZERO_MACRO, "");
123   // CHECK-FIXES-CXX17: {{^  }}static_assert(ZERO_MACRO);
124 
125   assert(!"Don't report me!");
126   // CHECK-FIXES: {{^  }}assert(!"Don't report me!");
127 
128   assert(0 && "Don't report me!");
129   // CHECK-FIXES: {{^  }}assert(0 && "Don't report me!");
130 
131   assert(false && "Don't report me!");
132   // CHECK-FIXES: {{^  }}assert(false && "Don't report me!");
133 
134 #define NULL ((void*)0)
135   assert(NULL && "Don't report me!");
136   // CHECK-FIXES: {{^  }}assert(NULL && "Don't report me!");
137 
138   assert(NULL == "Don't report me!");
139   // CHECK-FIXES: {{^  }}assert(NULL == "Don't report me!");
140 
141   assert("Don't report me!" == NULL);
142   // CHECK-FIXES: {{^  }}assert("Don't report me!" == NULL);
143 
144   assert(0 == "Don't report me!");
145   // CHECK-FIXES: {{^  }}assert(0 == "Don't report me!");
146 
147 #define NULL ((unsigned int)0)
148   assert(NULL && "Report me!");
149   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
150   // CHECK-FIXES: {{^  }}static_assert(NULL , "Report me!");
151 
152 #define NULL __null
153   assert(__null == "Don't report me!");
154   // CHECK-FIXES: {{^  }}assert(__null == "Don't report me!");
155   assert(NULL == "Don't report me!");
156   // CHECK-FIXES: {{^  }}assert(NULL == "Don't report me!");
157 #undef NULL
158 
159   assert(ZERO_MACRO && "Report me!");
160   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
161   // CHECK-FIXES: {{^  }}static_assert(ZERO_MACRO , "Report me!");
162 
163   assert(0);
164 
165 #define false false
166   assert(false);
167 
168 #define false 0
169   assert(false);
170 #undef false
171 
172   assert(10==5 && "Report me!");
173   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
174   // CHECK-FIXES: {{^  }}static_assert(10==5 , "Report me!");
175 
176   assert(strlen("12345") == 5);
177   // CHECK-FIXES: {{^  }}assert(strlen("12345") == 5);
178 
179 #define assert(e) (__builtin_expect(!(e), 0) ? print (#e, __FILE__, __LINE__) : (void)0)
180   assert(false);
181   // CHECK-FIXES: {{^  }}assert(false);
182 
183   assert(10 == 5 + 5);
184   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
185   // CHECK-FIXES-CXX11: {{^  }}static_assert(10 == 5 + 5, "");
186   // CHECK-FIXES-CXX17: {{^  }}static_assert(10 == 5 + 5);
187 #undef assert
188 
189   return 0;
190 }
191