diff options
author | Szabolcs Sipos <szabolcs.sipos@ericsson.com> | 2015-04-10 13:55:39 +0000 |
---|---|---|
committer | Szabolcs Sipos <szabolcs.sipos@ericsson.com> | 2015-04-10 13:55:39 +0000 |
commit | 8429681d5759005777475c0faf6d2149e40386ac (patch) | |
tree | 4163fe589f1361d76a5b0b45029285ac4f056d38 /clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp | |
parent | ae47f93b747d6cbbd0bc2f8f6ba45a36715de29b (diff) | |
download | llvm-8429681d5759005777475c0faf6d2149e40386ac.zip llvm-8429681d5759005777475c0faf6d2149e40386ac.tar.gz llvm-8429681d5759005777475c0faf6d2149e40386ac.tar.bz2 |
[clang-tidy] Fix for llvm.org/PR23161
The misc-static-assert check will not warn on the followings:
assert("Some message" == NULL);
assert(NULL == "Some message");
llvm-svn: 234596
Diffstat (limited to 'clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp')
-rw-r--r-- | clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp index 91451e6..c63cd74 100644 --- a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp @@ -27,15 +27,17 @@ StaticAssertCheck::StaticAssertCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} void StaticAssertCheck::registerMatchers(MatchFinder *Finder) { - auto IsAlwaysFalse = ignoringParenImpCasts( - anyOf(boolLiteral(equals(false)).bind("isAlwaysFalse"), - integerLiteral(equals(0)).bind("isAlwaysFalse"))); + auto IsAlwaysFalse = expr(ignoringParenImpCasts( + expr(anyOf(boolLiteral(equals(false)), integerLiteral(equals(0)), + nullPtrLiteralExpr())).bind("isAlwaysFalse"))); + auto IsAlwaysFalseWithCast = ignoringParenImpCasts(anyOf(IsAlwaysFalse, + cStyleCastExpr(has(IsAlwaysFalse)).bind("castExpr"))); auto AssertExprRoot = anyOf( binaryOperator( - hasOperatorName("&&"), + anyOf(hasOperatorName("&&"), hasOperatorName("==")), hasEitherOperand(ignoringImpCasts(stringLiteral().bind("assertMSG"))), - anyOf(binaryOperator(hasEitherOperand(IsAlwaysFalse)), anything())) - .bind("assertExprRoot"), + anyOf(binaryOperator(hasEitherOperand(IsAlwaysFalseWithCast)), + anything())).bind("assertExprRoot"), IsAlwaysFalse); auto Condition = expr(anyOf( expr(ignoringParenCasts(anyOf( @@ -60,6 +62,7 @@ void StaticAssertCheck::check(const MatchFinder::MatchResult &Result) { const auto *AssertMSG = Result.Nodes.getNodeAs<StringLiteral>("assertMSG"); const auto *AssertExprRoot = Result.Nodes.getNodeAs<BinaryOperator>("assertExprRoot"); + const auto *CastExpr = Result.Nodes.getNodeAs<CStyleCastExpr>("castExpr"); SourceLocation AssertExpansionLoc = CondStmt->getLocStart(); if (!Opts.CPlusPlus11 || !AssertExpansionLoc.isValid() || @@ -75,7 +78,7 @@ void StaticAssertCheck::check(const MatchFinder::MatchResult &Result) { return; // False literal is not the result of macro expansion. - if (IsAlwaysFalse) { + if (IsAlwaysFalse && (!CastExpr || CastExpr->getType()->isPointerType())) { SourceLocation FalseLiteralLoc = SM.getImmediateSpellingLoc(IsAlwaysFalse->getExprLoc()); if (!FalseLiteralLoc.isMacroID()) @@ -83,7 +86,8 @@ void StaticAssertCheck::check(const MatchFinder::MatchResult &Result) { StringRef FalseMacroName = Lexer::getImmediateMacroName(FalseLiteralLoc, SM, Opts); - if (FalseMacroName.compare_lower("false") == 0) + if (FalseMacroName.compare_lower("false") == 0 || + FalseMacroName.compare_lower("null") == 0) return; } |