diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2014-08-12 12:12:57 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2014-08-12 12:12:57 +0000 |
commit | 242b5b808b52e11c651543d1555ee3c87f32a4d7 (patch) | |
tree | f4f459e42768f8cfc386c4b28c2326d25745a96d | |
parent | 6318f7614f748acba9d8acb5b53e7a2df42aaa47 (diff) | |
download | bcm5719-llvm-242b5b808b52e11c651543d1555ee3c87f32a4d7.tar.gz bcm5719-llvm-242b5b808b52e11c651543d1555ee3c87f32a4d7.zip |
[clang-tidy] Disable the warning on implicit bool* to bool conversion in macros.
It's just too noisy and the warning isn't very helpful in those cases.
llvm-svn: 215439
-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) } |