1*89a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-bool-pointer-implicit-conversion %t 2*89a1d03eSRichard 3*89a1d03eSRichard bool *SomeFunction(); 4*89a1d03eSRichard void SomeOtherFunction(bool*); 5*89a1d03eSRichard bool F(); 6*89a1d03eSRichard void G(bool); 7*89a1d03eSRichard 8*89a1d03eSRichard 9*89a1d03eSRichard template <typename T> t(T b)10*89a1d03eSRichardvoid t(T b) { 11*89a1d03eSRichard if (b) { 12*89a1d03eSRichard } 13*89a1d03eSRichard } 14*89a1d03eSRichard foo()15*89a1d03eSRichardvoid foo() { 16*89a1d03eSRichard bool *b = SomeFunction(); 17*89a1d03eSRichard if (b) { 18*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: dubious check of 'bool *' against 'nullptr' 19*89a1d03eSRichard // CHECK-FIXES: if (*b) { 20*89a1d03eSRichard } 21*89a1d03eSRichard 22*89a1d03eSRichard if (F() && b) { 23*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: dubious check of 'bool *' against 'nullptr' 24*89a1d03eSRichard // CHECK-FIXES: if (F() && *b) { 25*89a1d03eSRichard } 26*89a1d03eSRichard 27*89a1d03eSRichard // TODO: warn here. 28*89a1d03eSRichard if (b) { 29*89a1d03eSRichard G(b); 30*89a1d03eSRichard } 31*89a1d03eSRichard 32*89a1d03eSRichard #define TESTMACRO if (b || F()) 33*89a1d03eSRichard 34*89a1d03eSRichard TESTMACRO { 35*89a1d03eSRichard } 36*89a1d03eSRichard 37*89a1d03eSRichard t(b); 38*89a1d03eSRichard 39*89a1d03eSRichard if (!b) { 40*89a1d03eSRichard // no-warning 41*89a1d03eSRichard } 42*89a1d03eSRichard 43*89a1d03eSRichard if (SomeFunction()) { 44*89a1d03eSRichard // no-warning 45*89a1d03eSRichard } 46*89a1d03eSRichard 47*89a1d03eSRichard bool *c = SomeFunction(); 48*89a1d03eSRichard if (c) { 49*89a1d03eSRichard (void)c; 50*89a1d03eSRichard (void)*c; // no-warning 51*89a1d03eSRichard } 52*89a1d03eSRichard 53*89a1d03eSRichard if (c) { 54*89a1d03eSRichard *c = true; // no-warning 55*89a1d03eSRichard } 56*89a1d03eSRichard 57*89a1d03eSRichard if (c) { 58*89a1d03eSRichard c[0] = false; // no-warning 59*89a1d03eSRichard } 60*89a1d03eSRichard 61*89a1d03eSRichard if (c) { 62*89a1d03eSRichard SomeOtherFunction(c); // no-warning 63*89a1d03eSRichard } 64*89a1d03eSRichard 65*89a1d03eSRichard if (c) { 66*89a1d03eSRichard delete[] c; // no-warning 67*89a1d03eSRichard } 68*89a1d03eSRichard 69*89a1d03eSRichard if (c) { 70*89a1d03eSRichard *(c) = false; // no-warning 71*89a1d03eSRichard } 72*89a1d03eSRichard 73*89a1d03eSRichard struct { 74*89a1d03eSRichard bool *b; 75*89a1d03eSRichard } d = { SomeFunction() }; 76*89a1d03eSRichard 77*89a1d03eSRichard if (d.b) { 78*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: dubious check of 'bool *' against 'nullptr' 79*89a1d03eSRichard // CHECK-FIXES: if (*d.b) { 80*89a1d03eSRichard } 81*89a1d03eSRichard 82*89a1d03eSRichard if (d.b) { 83*89a1d03eSRichard (void)*d.b; // no-warning 84*89a1d03eSRichard } 85*89a1d03eSRichard 86*89a1d03eSRichard #define CHECK(b) \ 87*89a1d03eSRichard if (b) { \ 88*89a1d03eSRichard } 89*89a1d03eSRichard CHECK(c) 90*89a1d03eSRichard } 91*89a1d03eSRichard 92*89a1d03eSRichard struct H { 93*89a1d03eSRichard bool *b; fooH94*89a1d03eSRichard void foo() const { 95*89a1d03eSRichard if (b) { 96*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: dubious check of 'bool *' against 'nullptr' 97*89a1d03eSRichard // CHECK-FIXES: if (*b) { 98*89a1d03eSRichard } 99*89a1d03eSRichard 100*89a1d03eSRichard if (b) { 101*89a1d03eSRichard (void)*b; // no-warning 102*89a1d03eSRichard } 103*89a1d03eSRichard } 104*89a1d03eSRichard }; 105