// RUN: %check_clang_tidy -std=c++11 -check-suffixes=,CXX11 %s misc-static-assert %t // RUN: %check_clang_tidy -std=c++17 -check-suffixes=,CXX17 %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 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-CXX11: {{^ }}static_assert(myfunc(1, 2), ""); // CHECK-FIXES-CXX17: {{^ }}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-CXX11: {{^ }}static_assert(myfunc(1, 2) && (3 == 4), ""); // CHECK-FIXES-CXX17: {{^ }}static_assert(myfunc(1, 2) && (3 == 4)); int x = 1; assert(x == 0); // CHECK-FIXES: {{^ }}assert(x == 0); A a; B b; doSomething(a); doSomething(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-CXX11: {{^ }}static_assert(ZERO_MACRO, ""); // CHECK-FIXES-CXX17: {{^ }}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-CXX11: {{^ }}static_assert(10 == 5 + 5, ""); // CHECK-FIXES-CXX17: {{^ }}static_assert(10 == 5 + 5); #undef assert return 0; }