1 // RUN: %check_clang_tidy -std=c++11 -check-suffixes=,CXX11 %s misc-static-assert %t 2 // RUN: %check_clang_tidy -std=c++17-or-later -check-suffixes=,CXX17 %s misc-static-assert %t 3 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 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: 30 bool method() { return true; } 31 }; 32 33 class B { 34 public: 35 constexpr bool method() { return true; } 36 }; 37 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 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