llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: None (martinboehme) <details> <summary>Changes</summary> To avoid generating unnecessary values, we don't create a new value but instead leave it to the specific analysis to do this if desired. --- Full diff: https://github.com/llvm/llvm-project/pull/94217.diff 2 Files Affected: - (modified) clang/lib/Analysis/FlowSensitive/Transfer.cpp (+14) - (modified) clang/unittests/Analysis/FlowSensitive/TransferTest.cpp (+36) ``````````diff diff --git a/clang/lib/Analysis/FlowSensitive/Transfer.cpp b/clang/lib/Analysis/FlowSensitive/Transfer.cpp index 4214488c98e5d..d161b231c0b6f 100644 --- a/clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ b/clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -382,6 +382,20 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> { Env.setValue(*S, Env.makeNot(*SubExprVal)); break; } + case UO_PreInc: + case UO_PreDec: + // Propagate the storage location, but don't create a new value; to + // avoid generating unnecessary values, we leave it to the specific + // analysis to do this if desired. + propagateStorageLocation(*S->getSubExpr(), *S, Env); + break; + case UO_PostInc: + case UO_PostDec: + // Propagate the old value, but don't create a new value; to avoid + // generating unnecessary values, we leave it to the specific analysis + // to do this if desired. + propagateValue(*S->getSubExpr(), *S, Env); + break; default: break; } diff --git a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp index 5c0582e872eb0..cdaee9b2c9288 100644 --- a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -3760,6 +3760,42 @@ TEST(TransferTest, AddrOfReference) { }); } +TEST(TransferTest, Preincrement) { + std::string Code = R"( + void target(int I) { + int &IRef = ++I; + // [[p]] + } + )"; + runDataflow( + Code, + [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, + ASTContext &ASTCtx) { + const Environment &Env = getEnvironmentAtAnnotation(Results, "p"); + + EXPECT_EQ(&getLocForDecl(ASTCtx, Env, "IRef"), + &getLocForDecl(ASTCtx, Env, "I")); + }); +} + +TEST(TransferTest, Postincrement) { + std::string Code = R"( + void target(int I) { + int OldVal = I++; + // [[p]] + } + )"; + runDataflow( + Code, + [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, + ASTContext &ASTCtx) { + const Environment &Env = getEnvironmentAtAnnotation(Results, "p"); + + EXPECT_EQ(&getValueForDecl(ASTCtx, Env, "OldVal"), + &getValueForDecl(ASTCtx, Env, "I")); + }); +} + TEST(TransferTest, CannotAnalyzeFunctionTemplate) { std::string Code = R"( template <typename T> `````````` </details> https://github.com/llvm/llvm-project/pull/94217 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits