usama54321 updated this revision to Diff 431516. usama54321 added a comment.
- updated canResolveToExpr to accept both statements and expressions. Removed unnecessary code Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D126034/new/ https://reviews.llvm.org/D126034 Files: clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h clang/lib/Analysis/ExprMutationAnalyzer.cpp
Index: clang/lib/Analysis/ExprMutationAnalyzer.cpp =================================================================== --- clang/lib/Analysis/ExprMutationAnalyzer.cpp +++ clang/lib/Analysis/ExprMutationAnalyzer.cpp @@ -39,8 +39,13 @@ return InnerMatcher.matches(*Result, Finder, Builder); } -AST_MATCHER_P(Expr, canResolveToExpr, ast_matchers::internal::Matcher<Expr>, +AST_MATCHER_P(Stmt, canResolveToExpr, ast_matchers::internal::Matcher<Stmt>, InnerMatcher) { + auto *Exp = dyn_cast<Expr>(&Node); + if (!Exp) { + return stmt().matches(Node, Finder, Builder); + } + auto DerivedToBase = [](const ast_matchers::internal::Matcher<Expr> &Inner) { return implicitCastExpr(anyOf(hasCastKind(CK_DerivedToBase), hasCastKind(CK_UncheckedDerivedToBase)), @@ -71,7 +76,7 @@ IgnoreDerivedToBase(ConditionalOperator), IgnoreDerivedToBase(ElvisOperator)))); - return ComplexMatcher.matches(Node, Finder, Builder); + return ComplexMatcher.matches(*Exp, Finder, Builder); } // Similar to 'hasAnyArgument', but does not work because 'InitListExpr' does @@ -194,12 +199,13 @@ return nullptr; } -bool ExprMutationAnalyzer::isUnevaluated(const Expr *Exp) { - return selectFirst<Expr>( +bool ExprMutationAnalyzer::isUnevaluated(const Stmt *Exp, const Stmt &Stm, + ASTContext &Context) { + return selectFirst<Stmt>( NodeID<Expr>::value, match( findAll( - expr(canResolveToExpr(equalsNode(Exp)), + stmt(canResolveToExpr(equalsNode(Exp)), anyOf( // `Exp` is part of the underlying expression of // decltype/typeof if it has an ancestor of @@ -225,6 +231,10 @@ Stm, Context)) != nullptr; } +bool ExprMutationAnalyzer::isUnevaluated(const Expr *Exp) { + return isUnevaluated(Exp, Stm, Context); +} + const Stmt * ExprMutationAnalyzer::findExprMutation(ArrayRef<BoundNodes> Matches) { return tryEachMatch<Expr>(Matches, this, &ExprMutationAnalyzer::findMutation); Index: clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h =================================================================== --- clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h +++ clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h @@ -38,6 +38,8 @@ } const Stmt *findPointeeMutation(const Expr *Exp); const Stmt *findPointeeMutation(const Decl *Dec); + static bool isUnevaluated(const Stmt *Smt, const Stmt &Stm, + ASTContext &Context); private: using MutationFinder = const Stmt *(ExprMutationAnalyzer::*)(const Expr *); Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp @@ -650,3 +650,38 @@ do { } while (1, (false) && val4 == 1); } + +void test_typeof() { + __typeof__({ + for (int i = 0; i < 10; ++i) { + } + 0; + }) x; +} + +void test_typeof_infinite() { + __typeof__({ + for (int i = 0; i < 10;) { + } + 0; + }) x; +} + +void test_typeof_while_infinite() { + __typeof__({ + int i = 0; + while (i < 10) { + } + 0; + }) x; +} + +void test_typeof_dowhile_infinite() { + __typeof__({ + int i = 0; + do { + + } while (i < 10); + 0; + }) x; +} Index: clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp +++ clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp @@ -177,6 +177,9 @@ } } + if (ExprMutationAnalyzer::isUnevaluated(LoopStmt, *LoopStmt, *Result.Context)) + return; + if (isAtLeastOneCondVarChanged(Func, LoopStmt, Cond, Result.Context)) return;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits