aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp
diff options
context:
space:
mode:
authorSzabolcs Sipos <szabolcs.sipos@ericsson.com>2015-04-10 13:55:39 +0000
committerSzabolcs Sipos <szabolcs.sipos@ericsson.com>2015-04-10 13:55:39 +0000
commit8429681d5759005777475c0faf6d2149e40386ac (patch)
tree4163fe589f1361d76a5b0b45029285ac4f056d38 /clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp
parentae47f93b747d6cbbd0bc2f8f6ba45a36715de29b (diff)
downloadllvm-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.cpp20
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;
}