diff options
-rw-r--r-- | clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversion.cpp | 10 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp | 7 |
2 files changed, 12 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversion.cpp b/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversion.cpp index 6565874a340..c745366cf44 100644 --- a/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversion.cpp +++ b/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversion.cpp @@ -24,6 +24,9 @@ AST_MATCHER(QualType, isBoolean) { return Node->isBooleanType(); } namespace tidy { void BoolPointerImplicitConversion::registerMatchers(MatchFinder *Finder) { + auto InTemplateInstantiation = hasAncestor( + decl(anyOf(recordDecl(ast_matchers::isTemplateInstantiation()), + functionDecl(ast_matchers::isTemplateInstantiation())))); // Look for ifs that have an implicit bool* to bool conversion in the // condition. Filter negations. Finder->addMatcher( @@ -32,7 +35,8 @@ void BoolPointerImplicitConversion::registerMatchers(MatchFinder *Finder) { hasSourceExpression(expr( hasType(pointerType(pointee(isBoolean()))), ignoringParenImpCasts(declRefExpr().bind("expr")))), - isPointerToBoolean()))))).bind("if"), + isPointerToBoolean())))), + unless(InTemplateInstantiation)).bind("if"), this); } @@ -41,6 +45,10 @@ BoolPointerImplicitConversion::check(const MatchFinder::MatchResult &Result) { auto *If = Result.Nodes.getStmtAs<IfStmt>("if"); auto *Var = Result.Nodes.getStmtAs<DeclRefExpr>("expr"); + // Ignore macros. + if (Var->getLocStart().isMacroID()) + return; + // Only allow variable accesses for now, no function calls or member exprs. // Check that we don't dereference the variable anywhere within the if. This // avoids false positives for checks of the pointer for nullptr before it is diff --git a/clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp b/clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp index ab3cf1cd49b..2a27e6cd87a 100644 --- a/clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp +++ b/clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp @@ -33,10 +33,6 @@ void foo() { #define TESTMACRO if (b || F()) TESTMACRO { -// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: dubious check of 'bool *' against 'nullptr' -// Can't fix this. -// CHECK-FIXES: #define TESTMACRO if (b || F()) -// CHECK-FIXES: TESTMACRO { } t(b); @@ -81,4 +77,7 @@ void foo() { if (d.b) (void)*d.b; // no-warning + +#define CHECK(b) if (b) {} + CHECK(c) } |