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