| commit be6b9e8ae71768d2e09ec14619ca4ecfdef553fa |
| Author: Roman Lebedev <lebedev.ri@gmail.com> |
| Date: Sun May 30 16:40:01 2021 +0300 |
| |
| 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. |
| |
| diff --git a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp |
| index e9ea69aaeb32..224936887e03 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 796fc4827db4..0168d1fcd107 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<TraversalKind> getCheckTraversalKind() const override { |
| - return TK_IgnoreUnlessSpelledInSource; |
| - } |
| |
| private: |
| SourceLocation getLastParenLoc(const ASTContext *ASTCtx, |