From be6b9e8ae71768d2e09ec14619ca4ecfdef553fa Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Sun, 30 May 2021 16:40:01 +0300 Subject: [PATCH] Revert "[clang-tidy] Simplify static assert check" This patch starts to produce a very obvious false-positives, despite the fact the preexisting tests already cover the pattern. they clearly don't actually cover it. https://godbolt.org/z/3zdqvbfxj This reverts commit 1709bb8c7395418236ec94fe3b9d91fed746452b. --- .../clang-tidy/misc/StaticAssertCheck.cpp | 49 +++++++++++++--------- .../clang-tidy/misc/StaticAssertCheck.h | 3 -- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp index e9ea69aa..2249368 100644 --- a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp @@ -27,37 +27,48 @@ StaticAssertCheck::StaticAssertCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} void StaticAssertCheck::registerMatchers(MatchFinder *Finder) { - auto NegatedString = - unaryOperator(hasOperatorName("!"), hasUnaryOperand(stringLiteral())); + auto NegatedString = unaryOperator( + hasOperatorName("!"), hasUnaryOperand(ignoringImpCasts(stringLiteral()))); auto IsAlwaysFalse = expr(anyOf(cxxBoolLiteral(equals(false)), integerLiteral(equals(0)), cxxNullPtrLiteralExpr(), gnuNullExpr(), NegatedString)) .bind("isAlwaysFalse"); - auto IsAlwaysFalseWithCast = - anyOf(IsAlwaysFalse, cStyleCastExpr(has(IsAlwaysFalse)).bind("castExpr")); - auto AssertExprRoot = - anyOf(binaryOperator( - hasAnyOperatorName("&&", "=="), - hasEitherOperand(stringLiteral().bind("assertMSG")), - anyOf(binaryOperator(hasEitherOperand(IsAlwaysFalseWithCast)), - anything())) - .bind("assertExprRoot"), - IsAlwaysFalse); + auto IsAlwaysFalseWithCast = ignoringParenImpCasts(anyOf( + IsAlwaysFalse, cStyleCastExpr(has(ignoringParenImpCasts(IsAlwaysFalse))) + .bind("castExpr"))); + auto AssertExprRoot = anyOf( + binaryOperator( + hasAnyOperatorName("&&", "=="), + hasEitherOperand(ignoringImpCasts(stringLiteral().bind("assertMSG"))), + anyOf(binaryOperator(hasEitherOperand(IsAlwaysFalseWithCast)), + anything())) + .bind("assertExprRoot"), + IsAlwaysFalse); auto NonConstexprFunctionCall = callExpr(hasDeclaration(functionDecl(unless(isConstexpr())))); auto AssertCondition = - expr(optionally(expr(anyOf(AssertExprRoot, - unaryOperator(hasUnaryOperand(AssertExprRoot))))), - unless(findAll(NonConstexprFunctionCall))) + expr( + anyOf(expr(ignoringParenCasts(anyOf( + AssertExprRoot, unaryOperator(hasUnaryOperand( + ignoringParenCasts(AssertExprRoot)))))), + anything()), + unless(findAll(NonConstexprFunctionCall))) .bind("condition"); auto Condition = - anyOf(callExpr(traverse(TK_AsIs, callExpr(hasDeclaration(functionDecl( - hasName("__builtin_expect"))))), - hasArgument(0, AssertCondition)), + anyOf(ignoringParenImpCasts(callExpr( + hasDeclaration(functionDecl(hasName("__builtin_expect"))), + hasArgument(0, AssertCondition))), AssertCondition); + Finder->addMatcher(conditionalOperator(hasCondition(Condition), + unless(isInTemplateInstantiation())) + .bind("condStmt"), + this); + Finder->addMatcher( - mapAnyOf(ifStmt, conditionalOperator).with(hasCondition(Condition)).bind("condStmt"), this); + ifStmt(hasCondition(Condition), unless(isInTemplateInstantiation())) + .bind("condStmt"), + this); } void StaticAssertCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.h b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.h index 796fc48..0168d1f 100644 --- a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.h +++ b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.h @@ -30,9 +30,6 @@ public: } void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - llvm::Optional getCheckTraversalKind() const override { - return TK_IgnoreUnlessSpelledInSource; - } private: SourceLocation getLastParenLoc(const ASTContext *ASTCtx, -- 2.7.4