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