|  | // RUN: %check_clang_tidy %s misc-static-assert %t | 
|  |  | 
|  | void abort() {} | 
|  | #ifdef NDEBUG | 
|  | #define assert(x) 1 | 
|  | #else | 
|  | #define assert(x)                                                              \ | 
|  | if (!(x))                                                                    \ | 
|  | abort() | 
|  | #endif | 
|  |  | 
|  | void print(...); | 
|  |  | 
|  | #define ZERO_MACRO 0 | 
|  |  | 
|  | #define False false | 
|  | #define FALSE 0 | 
|  |  | 
|  | #define my_macro() assert(0 == 1) | 
|  | // CHECK-FIXES: #define my_macro() assert(0 == 1) | 
|  |  | 
|  | constexpr bool myfunc(int a, int b) { return a * b == 0; } | 
|  |  | 
|  | typedef __SIZE_TYPE__ size_t; | 
|  | extern "C" size_t strlen(const char *s); | 
|  |  | 
|  | class A { | 
|  | public: | 
|  | bool method() { return true; } | 
|  | }; | 
|  |  | 
|  | class B { | 
|  | public: | 
|  | constexpr bool method() { return true; } | 
|  | }; | 
|  |  | 
|  | template <class T> void doSomething(T t) { | 
|  | assert(myfunc(1, 2)); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert] | 
|  | // CHECK-FIXES: {{^  }}static_assert(myfunc(1, 2), ""); | 
|  |  | 
|  | assert(t.method()); | 
|  | // CHECK-FIXES: {{^  }}assert(t.method()); | 
|  |  | 
|  | assert(sizeof(T) == 123); | 
|  | } | 
|  |  | 
|  | int main() { | 
|  | my_macro(); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be | 
|  | // CHECK-FIXES: {{^  }}my_macro(); | 
|  |  | 
|  | assert(myfunc(1, 2) && (3 == 4)); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be | 
|  | // CHECK-FIXES: {{^  }}static_assert(myfunc(1, 2) && (3 == 4), ""); | 
|  |  | 
|  | int x = 1; | 
|  | assert(x == 0); | 
|  | // CHECK-FIXES: {{^  }}assert(x == 0); | 
|  |  | 
|  | A a; | 
|  | B b; | 
|  |  | 
|  | doSomething<A>(a); | 
|  | doSomething<B>(b); | 
|  |  | 
|  | assert(false); | 
|  | // CHECK-FIXES: {{^  }}assert(false); | 
|  |  | 
|  | assert(False); | 
|  | // CHECK-FIXES: {{^  }}assert(False); | 
|  | assert(FALSE); | 
|  | // CHECK-FIXES: {{^  }}assert(FALSE); | 
|  |  | 
|  | assert(ZERO_MACRO); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be | 
|  | // CHECK-FIXES: {{^  }}static_assert(ZERO_MACRO, ""); | 
|  |  | 
|  | assert(!"Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(!"Don't report me!"); | 
|  |  | 
|  | assert(0 && "Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(0 && "Don't report me!"); | 
|  |  | 
|  | assert(false && "Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(false && "Don't report me!"); | 
|  |  | 
|  | #define NULL ((void*)0) | 
|  | assert(NULL && "Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(NULL && "Don't report me!"); | 
|  |  | 
|  | assert(NULL == "Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(NULL == "Don't report me!"); | 
|  |  | 
|  | assert("Don't report me!" == NULL); | 
|  | // CHECK-FIXES: {{^  }}assert("Don't report me!" == NULL); | 
|  |  | 
|  | assert(0 == "Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(0 == "Don't report me!"); | 
|  |  | 
|  | #define NULL ((unsigned int)0) | 
|  | assert(NULL && "Report me!"); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be | 
|  | // CHECK-FIXES: {{^  }}static_assert(NULL , "Report me!"); | 
|  |  | 
|  | #define NULL __null | 
|  | assert(__null == "Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(__null == "Don't report me!"); | 
|  | assert(NULL == "Don't report me!"); | 
|  | // CHECK-FIXES: {{^  }}assert(NULL == "Don't report me!"); | 
|  | #undef NULL | 
|  |  | 
|  | assert(ZERO_MACRO && "Report me!"); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be | 
|  | // CHECK-FIXES: {{^  }}static_assert(ZERO_MACRO , "Report me!"); | 
|  |  | 
|  | assert(0); | 
|  |  | 
|  | #define false false | 
|  | assert(false); | 
|  |  | 
|  | #define false 0 | 
|  | assert(false); | 
|  | #undef false | 
|  |  | 
|  | assert(10==5 && "Report me!"); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be | 
|  | // CHECK-FIXES: {{^  }}static_assert(10==5 , "Report me!"); | 
|  |  | 
|  | assert(strlen("12345") == 5); | 
|  | // CHECK-FIXES: {{^  }}assert(strlen("12345") == 5); | 
|  |  | 
|  | #define assert(e) (__builtin_expect(!(e), 0) ? print (#e, __FILE__, __LINE__) : (void)0) | 
|  | assert(false); | 
|  | // CHECK-FIXES: {{^  }}assert(false); | 
|  |  | 
|  | assert(10 == 5 + 5); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be | 
|  | // CHECK-FIXES: {{^  }}static_assert(10 == 5 + 5, ""); | 
|  | #undef assert | 
|  |  | 
|  | return 0; | 
|  | } |