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