brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 897049c Raw
191 lines · cpp
1// RUN: %check_clang_tidy -std=c++11 -check-suffixes=,CXX11 %s misc-static-assert %t2// RUN: %check_clang_tidy -std=c++17-or-later -check-suffixes=,CXX17 %s misc-static-assert %t3 4void abort() {}5#ifdef NDEBUG6#define assert(x) 17#else8#define assert(x)                                                              \9  if (!(x))                                                                    \10  abort()11#endif12 13void print(...);14 15#define ZERO_MACRO 016 17#define False false18#define FALSE 019 20#define my_macro() assert(0 == 1)21// CHECK-FIXES: #define my_macro() assert(0 == 1)22 23namespace PR24066 {24 25void referenceMember() {26  struct {27    int A;28    int B;29  } S;30  assert(&S.B - &S.A == 1);31}32 33const int X = 1;34void referenceVariable() {35  assert(X > 0);36}37 38 39constexpr int Y = 1;40void referenceConstexprVariable() {41  assert(Y > 0);42  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]43  // CHECK-FIXES-CXX11: static_assert(Y > 0, "");44  // CHECK-FIXES-CXX17: static_assert(Y > 0);45}46 47void useInSizeOf() {48  char a = 0;49  assert(sizeof(a) == 1U);50  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]51  // CHECK-FIXES-CXX11: static_assert(sizeof(a) == 1U, "");52  // CHECK-FIXES-CXX17: static_assert(sizeof(a) == 1U);53}54 55void useInDecltype() {56  char a = 0;57  assert(static_cast<decltype(a)>(256) == 0);58  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]59  // CHECK-FIXES-CXX11: static_assert(static_cast<decltype(a)>(256) == 0, "");60  // CHECK-FIXES-CXX17: static_assert(static_cast<decltype(a)>(256) == 0);61}62 63}64 65constexpr bool myfunc(int a, int b) { return a * b == 0; }66 67typedef __SIZE_TYPE__ size_t;68extern "C" size_t strlen(const char *s);69 70class A {71public:72  bool method() { return true; }73};74 75class B {76public:77  constexpr bool method() { return true; }78};79 80template <class T> void doSomething(T t) {81  assert(myfunc(1, 2));82  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be replaced by static_assert() [misc-static-assert]83  // CHECK-FIXES-CXX11: static_assert(myfunc(1, 2), "");84  // CHECK-FIXES-CXX17: static_assert(myfunc(1, 2));85 86  assert(t.method());87  // CHECK-FIXES: assert(t.method());88 89  assert(sizeof(T) == 123);90}91 92int main() {93  my_macro();94  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be95  // CHECK-FIXES: my_macro();96 97  assert(myfunc(1, 2) && (3 == 4));98  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be99  // CHECK-FIXES-CXX11: static_assert(myfunc(1, 2) && (3 == 4), "");100  // CHECK-FIXES-CXX17: static_assert(myfunc(1, 2) && (3 == 4));101 102  int x = 1;103  assert(x == 0);104  // CHECK-FIXES: assert(x == 0);105 106  A a;107  B b;108 109  doSomething<A>(a);110  doSomething<B>(b);111 112  assert(false);113  // CHECK-FIXES: assert(false);114 115  assert(False);116  // CHECK-FIXES: assert(False);117  assert(FALSE);118  // CHECK-FIXES: assert(FALSE);119 120  assert(ZERO_MACRO);121  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be122  // CHECK-FIXES-CXX11: static_assert(ZERO_MACRO, "");123  // CHECK-FIXES-CXX17: static_assert(ZERO_MACRO);124 125  assert(!"Don't report me!");126  // CHECK-FIXES: assert(!"Don't report me!");127 128  assert(0 && "Don't report me!");129  // CHECK-FIXES: assert(0 && "Don't report me!");130 131  assert(false && "Don't report me!");132  // CHECK-FIXES: assert(false && "Don't report me!");133 134#define NULL ((void*)0)135  assert(NULL && "Don't report me!");136  // CHECK-FIXES: assert(NULL && "Don't report me!");137 138  assert(NULL == "Don't report me!");139  // CHECK-FIXES: assert(NULL == "Don't report me!");140 141  assert("Don't report me!" == NULL);142  // CHECK-FIXES: assert("Don't report me!" == NULL);143 144  assert(0 == "Don't report me!");145  // CHECK-FIXES: assert(0 == "Don't report me!");146 147#define NULL ((unsigned int)0)148  assert(NULL && "Report me!");149  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be150  // CHECK-FIXES: static_assert(NULL , "Report me!");151 152#define NULL __null153  assert(__null == "Don't report me!");154  // CHECK-FIXES: assert(__null == "Don't report me!");155  assert(NULL == "Don't report me!");156  // CHECK-FIXES: assert(NULL == "Don't report me!");157#undef NULL158 159  assert(ZERO_MACRO && "Report me!");160  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be161  // CHECK-FIXES: static_assert(ZERO_MACRO , "Report me!");162 163  assert(0);164 165#define false false166  assert(false);167 168#define false 0169  assert(false);170#undef false171 172  assert(10==5 && "Report me!");173  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be174  // CHECK-FIXES: static_assert(10==5 , "Report me!");175 176  assert(strlen("12345") == 5);177  // CHECK-FIXES: assert(strlen("12345") == 5);178 179#define assert(e) (__builtin_expect(!(e), 0) ? print (#e, __FILE__, __LINE__) : (void)0)180  assert(false);181  // CHECK-FIXES: assert(false);182 183  assert(10 == 5 + 5);184  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found assert() that could be185  // CHECK-FIXES-CXX11: static_assert(10 == 5 + 5, "");186  // CHECK-FIXES-CXX17: static_assert(10 == 5 + 5);187#undef assert188 189  return 0;190}191