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