diff options
author | Yitzhak Mandelbaum <yitzhakm@google.com> | 2023-08-25 14:47:05 +0000 |
---|---|---|
committer | Yitzhak Mandelbaum <yitzhakm@google.com> | 2023-08-28 17:35:34 +0000 |
commit | 824b136591303a2bec62cc752ec89843fbbc0ca0 (patch) | |
tree | cd4a571ac132b71a8acdaa5dfa16f662afe7d4f1 | |
parent | d80992032fd0d7da70b2bd1a59066703c3c21fbb (diff) | |
download | llvm-824b136591303a2bec62cc752ec89843fbbc0ca0.zip llvm-824b136591303a2bec62cc752ec89843fbbc0ca0.tar.gz llvm-824b136591303a2bec62cc752ec89843fbbc0ca0.tar.bz2 |
[clang][dataflow] Support range-for loops in fixpoint algorithm.
Adds support for recognizing range-for loops in the main algorithm for computing
the model fixpoint.
Differential Revision: https://reviews.llvm.org/D158848
-rw-r--r-- | clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp | 8 | ||||
-rw-r--r-- | clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp | 17 |
2 files changed, 25 insertions, 0 deletions
diff --git a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp index ae108a7..626b57b 100644 --- a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp +++ b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp @@ -21,6 +21,7 @@ #include "clang/AST/ASTDumper.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/OperationKinds.h" +#include "clang/AST/StmtCXX.h" #include "clang/AST/StmtVisitor.h" #include "clang/Analysis/Analyses/PostOrderCFGView.h" #include "clang/Analysis/CFG.h" @@ -58,6 +59,7 @@ static bool isLoopHead(const CFGBlock &B) { case Stmt::WhileStmtClass: case Stmt::DoStmtClass: case Stmt::ForStmtClass: + case Stmt::CXXForRangeStmtClass: return true; default: return false; @@ -108,6 +110,12 @@ public: return {nullptr, false}; } + TerminatorVisitorRetTy VisitCXXForRangeStmt(const CXXForRangeStmt *) { + // Don't do anything special for CXXForRangeStmt, because the condition + // (being implicitly generated) isn't visible from the loop body. + return {nullptr, false}; + } + TerminatorVisitorRetTy VisitBinaryOperator(const BinaryOperator *S) { assert(S->getOpcode() == BO_LAnd || S->getOpcode() == BO_LOr); auto *LHS = S->getLHS(); diff --git a/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp b/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp index 8e43ef7..de0b5c7 100644 --- a/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp @@ -1612,4 +1612,21 @@ TEST_F(TopTest, TopUnusedBeforeLoopHeadJoinsToTop) { }); } + +TEST_F(TopTest, ForRangeStmtConverges) { + std::string Code = R"( + void target(bool Foo) { + int Ints[10]; + bool B = false; + for (int I : Ints) + B = true; + } + )"; + runDataflow(Code, + [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &, + const AnalysisOutputs &) { + // No additional expectations. We're only checking that the + // analysis converged. + }); +} } // namespace |