189a1d03eSRichard // RUN: %check_clang_tidy -std=c++11 -check-suffixes=,CXX11 %s misc-static-assert %t
2b4d9ac8bSUtkarsh Saxena // RUN: %check_clang_tidy -std=c++17-or-later -check-suffixes=,CXX17 %s misc-static-assert %t
389a1d03eSRichard
abort()489a1d03eSRichard void abort() {}
589a1d03eSRichard #ifdef NDEBUG
689a1d03eSRichard #define assert(x) 1
789a1d03eSRichard #else
889a1d03eSRichard #define assert(x) \
989a1d03eSRichard if (!(x)) \
1089a1d03eSRichard abort()
1189a1d03eSRichard #endif
1289a1d03eSRichard
1389a1d03eSRichard void print(...);
1489a1d03eSRichard
1589a1d03eSRichard #define ZERO_MACRO 0
1689a1d03eSRichard
1789a1d03eSRichard #define False false
1889a1d03eSRichard #define FALSE 0
1989a1d03eSRichard
2089a1d03eSRichard #define my_macro() assert(0 == 1)
2189a1d03eSRichard // CHECK-FIXES: #define my_macro() assert(0 == 1)
2289a1d03eSRichard
23*3af6ae0fSPiotr Zegar namespace PR24066 {
24*3af6ae0fSPiotr Zegar
referenceMember()25*3af6ae0fSPiotr Zegar void referenceMember() {
26*3af6ae0fSPiotr Zegar struct {
27*3af6ae0fSPiotr Zegar int A;
28*3af6ae0fSPiotr Zegar int B;
29*3af6ae0fSPiotr Zegar } S;
30*3af6ae0fSPiotr Zegar assert(&S.B - &S.A == 1);
31*3af6ae0fSPiotr Zegar }
32*3af6ae0fSPiotr Zegar
33*3af6ae0fSPiotr Zegar const int X = 1;
referenceVariable()34*3af6ae0fSPiotr Zegar void referenceVariable() {
35*3af6ae0fSPiotr Zegar assert(X > 0);
36*3af6ae0fSPiotr Zegar }
37*3af6ae0fSPiotr Zegar
38*3af6ae0fSPiotr Zegar
39*3af6ae0fSPiotr Zegar constexpr int Y = 1;
referenceConstexprVariable()40*3af6ae0fSPiotr Zegar void referenceConstexprVariable() {
41*3af6ae0fSPiotr Zegar assert(Y > 0);
42*3af6ae0fSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
43*3af6ae0fSPiotr Zegar // CHECK-FIXES-CXX11: {{^ }}static_assert(Y > 0, "");
44*3af6ae0fSPiotr Zegar // CHECK-FIXES-CXX17: {{^ }}static_assert(Y > 0);
45*3af6ae0fSPiotr Zegar }
46*3af6ae0fSPiotr Zegar
useInSizeOf()47*3af6ae0fSPiotr Zegar void useInSizeOf() {
48*3af6ae0fSPiotr Zegar char a = 0;
49*3af6ae0fSPiotr Zegar assert(sizeof(a) == 1U);
50*3af6ae0fSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
51*3af6ae0fSPiotr Zegar // CHECK-FIXES-CXX11: {{^ }}static_assert(sizeof(a) == 1U, "");
52*3af6ae0fSPiotr Zegar // CHECK-FIXES-CXX17: {{^ }}static_assert(sizeof(a) == 1U);
53*3af6ae0fSPiotr Zegar }
54*3af6ae0fSPiotr Zegar
useInDecltype()55*3af6ae0fSPiotr Zegar void useInDecltype() {
56*3af6ae0fSPiotr Zegar char a = 0;
57*3af6ae0fSPiotr Zegar assert(static_cast<decltype(a)>(256) == 0);
58*3af6ae0fSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
59*3af6ae0fSPiotr Zegar // CHECK-FIXES-CXX11: {{^ }}static_assert(static_cast<decltype(a)>(256) == 0, "");
60*3af6ae0fSPiotr Zegar // CHECK-FIXES-CXX17: {{^ }}static_assert(static_cast<decltype(a)>(256) == 0);
61*3af6ae0fSPiotr Zegar }
62*3af6ae0fSPiotr Zegar
63*3af6ae0fSPiotr Zegar }
64*3af6ae0fSPiotr Zegar
myfunc(int a,int b)6589a1d03eSRichard constexpr bool myfunc(int a, int b) { return a * b == 0; }
6689a1d03eSRichard
6789a1d03eSRichard typedef __SIZE_TYPE__ size_t;
6889a1d03eSRichard extern "C" size_t strlen(const char *s);
6989a1d03eSRichard
7089a1d03eSRichard class A {
7189a1d03eSRichard public:
method()7289a1d03eSRichard bool method() { return true; }
7389a1d03eSRichard };
7489a1d03eSRichard
7589a1d03eSRichard class B {
7689a1d03eSRichard public:
method()7789a1d03eSRichard constexpr bool method() { return true; }
7889a1d03eSRichard };
7989a1d03eSRichard
doSomething(T t)8089a1d03eSRichard template <class T> void doSomething(T t) {
8189a1d03eSRichard assert(myfunc(1, 2));
8289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]
8389a1d03eSRichard // CHECK-FIXES-CXX11: {{^ }}static_assert(myfunc(1, 2), "");
8489a1d03eSRichard // CHECK-FIXES-CXX17: {{^ }}static_assert(myfunc(1, 2));
8589a1d03eSRichard
8689a1d03eSRichard assert(t.method());
8789a1d03eSRichard // CHECK-FIXES: {{^ }}assert(t.method());
8889a1d03eSRichard
8989a1d03eSRichard assert(sizeof(T) == 123);
9089a1d03eSRichard }
9189a1d03eSRichard
main()9289a1d03eSRichard int main() {
9389a1d03eSRichard my_macro();
9489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
9589a1d03eSRichard // CHECK-FIXES: {{^ }}my_macro();
9689a1d03eSRichard
9789a1d03eSRichard assert(myfunc(1, 2) && (3 == 4));
9889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
9989a1d03eSRichard // CHECK-FIXES-CXX11: {{^ }}static_assert(myfunc(1, 2) && (3 == 4), "");
10089a1d03eSRichard // CHECK-FIXES-CXX17: {{^ }}static_assert(myfunc(1, 2) && (3 == 4));
10189a1d03eSRichard
10289a1d03eSRichard int x = 1;
10389a1d03eSRichard assert(x == 0);
10489a1d03eSRichard // CHECK-FIXES: {{^ }}assert(x == 0);
10589a1d03eSRichard
10689a1d03eSRichard A a;
10789a1d03eSRichard B b;
10889a1d03eSRichard
10989a1d03eSRichard doSomething<A>(a);
11089a1d03eSRichard doSomething<B>(b);
11189a1d03eSRichard
11289a1d03eSRichard assert(false);
11389a1d03eSRichard // CHECK-FIXES: {{^ }}assert(false);
11489a1d03eSRichard
11589a1d03eSRichard assert(False);
11689a1d03eSRichard // CHECK-FIXES: {{^ }}assert(False);
11789a1d03eSRichard assert(FALSE);
11889a1d03eSRichard // CHECK-FIXES: {{^ }}assert(FALSE);
11989a1d03eSRichard
12089a1d03eSRichard assert(ZERO_MACRO);
12189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
12289a1d03eSRichard // CHECK-FIXES-CXX11: {{^ }}static_assert(ZERO_MACRO, "");
12389a1d03eSRichard // CHECK-FIXES-CXX17: {{^ }}static_assert(ZERO_MACRO);
12489a1d03eSRichard
12589a1d03eSRichard assert(!"Don't report me!");
12689a1d03eSRichard // CHECK-FIXES: {{^ }}assert(!"Don't report me!");
12789a1d03eSRichard
12889a1d03eSRichard assert(0 && "Don't report me!");
12989a1d03eSRichard // CHECK-FIXES: {{^ }}assert(0 && "Don't report me!");
13089a1d03eSRichard
13189a1d03eSRichard assert(false && "Don't report me!");
13289a1d03eSRichard // CHECK-FIXES: {{^ }}assert(false && "Don't report me!");
13389a1d03eSRichard
13489a1d03eSRichard #define NULL ((void*)0)
13589a1d03eSRichard assert(NULL && "Don't report me!");
13689a1d03eSRichard // CHECK-FIXES: {{^ }}assert(NULL && "Don't report me!");
13789a1d03eSRichard
13889a1d03eSRichard assert(NULL == "Don't report me!");
13989a1d03eSRichard // CHECK-FIXES: {{^ }}assert(NULL == "Don't report me!");
14089a1d03eSRichard
14189a1d03eSRichard assert("Don't report me!" == NULL);
14289a1d03eSRichard // CHECK-FIXES: {{^ }}assert("Don't report me!" == NULL);
14389a1d03eSRichard
14489a1d03eSRichard assert(0 == "Don't report me!");
14589a1d03eSRichard // CHECK-FIXES: {{^ }}assert(0 == "Don't report me!");
14689a1d03eSRichard
14789a1d03eSRichard #define NULL ((unsigned int)0)
14889a1d03eSRichard assert(NULL && "Report me!");
14989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
15089a1d03eSRichard // CHECK-FIXES: {{^ }}static_assert(NULL , "Report me!");
15189a1d03eSRichard
15289a1d03eSRichard #define NULL __null
15389a1d03eSRichard assert(__null == "Don't report me!");
15489a1d03eSRichard // CHECK-FIXES: {{^ }}assert(__null == "Don't report me!");
15589a1d03eSRichard assert(NULL == "Don't report me!");
15689a1d03eSRichard // CHECK-FIXES: {{^ }}assert(NULL == "Don't report me!");
15789a1d03eSRichard #undef NULL
15889a1d03eSRichard
15989a1d03eSRichard assert(ZERO_MACRO && "Report me!");
16089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
16189a1d03eSRichard // CHECK-FIXES: {{^ }}static_assert(ZERO_MACRO , "Report me!");
16289a1d03eSRichard
16389a1d03eSRichard assert(0);
16489a1d03eSRichard
16589a1d03eSRichard #define false false
16689a1d03eSRichard assert(false);
16789a1d03eSRichard
16889a1d03eSRichard #define false 0
16989a1d03eSRichard assert(false);
17089a1d03eSRichard #undef false
17189a1d03eSRichard
17289a1d03eSRichard assert(10==5 && "Report me!");
17389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
17489a1d03eSRichard // CHECK-FIXES: {{^ }}static_assert(10==5 , "Report me!");
17589a1d03eSRichard
17689a1d03eSRichard assert(strlen("12345") == 5);
17789a1d03eSRichard // CHECK-FIXES: {{^ }}assert(strlen("12345") == 5);
17889a1d03eSRichard
17989a1d03eSRichard #define assert(e) (__builtin_expect(!(e), 0) ? print (#e, __FILE__, __LINE__) : (void)0)
18089a1d03eSRichard assert(false);
18189a1d03eSRichard // CHECK-FIXES: {{^ }}assert(false);
18289a1d03eSRichard
18389a1d03eSRichard assert(10 == 5 + 5);
18489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be
18589a1d03eSRichard // CHECK-FIXES-CXX11: {{^ }}static_assert(10 == 5 + 5, "");
18689a1d03eSRichard // CHECK-FIXES-CXX17: {{^ }}static_assert(10 == 5 + 5);
18789a1d03eSRichard #undef assert
18889a1d03eSRichard
18989a1d03eSRichard return 0;
19089a1d03eSRichard }
191