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