mboehme created this revision. Herald added subscribers: martong, xazax.hun. Herald added a reviewer: NoQ. Herald added a project: All. mboehme requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This patch includes a test that fails without the fix. I discovered that we weren't creating `Value`s for integer literals when, in a different patch, I tried to overwrite the value of a struct field with a literal for the purposes of a test and was surprised to find that the struct compared the same before and after the assignment. This functionality therefore seems useful at least for tests, but is probably also useful for actual analysis of code. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D152813 Files: clang/lib/Analysis/FlowSensitive/Transfer.cpp clang/unittests/Analysis/FlowSensitive/TransferTest.cpp Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -811,6 +811,31 @@ }); } +TEST(TransferTest, BinaryOperatorAssignLiteral) { + std::string Code = R"( + void target() { + int Foo = 1; + // [[before]] + Foo = 2; + // [[after]] + } + )"; + runDataflow( + Code, + [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, + ASTContext &ASTCtx) { + const Environment &Before = + getEnvironmentAtAnnotation(Results, "before"); + const Environment &After = getEnvironmentAtAnnotation(Results, "after"); + + const auto &ValBefore = + getValueForDecl<IntegerValue>(ASTCtx, Before, "Foo"); + const auto &ValAfter = + getValueForDecl<IntegerValue>(ASTCtx, After, "Foo"); + EXPECT_NE(&ValBefore, &ValAfter); + }); +} + TEST(TransferTest, VarDeclInitAssign) { std::string Code = R"( void target() { Index: clang/lib/Analysis/FlowSensitive/Transfer.cpp =================================================================== --- clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -775,6 +775,11 @@ Env.setValueStrict(*S, Env.getBoolLiteralValue(S->getValue())); } + void VisitIntegerLiteral(const IntegerLiteral *S) { + if (Value *Val = Env.createValue(S->getType())) + Env.setValueStrict(*S, *Val); + } + void VisitParenExpr(const ParenExpr *S) { // The CFG does not contain `ParenExpr` as top-level statements in basic // blocks, however manual traversal to sub-expressions may encounter them.
Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -811,6 +811,31 @@ }); } +TEST(TransferTest, BinaryOperatorAssignLiteral) { + std::string Code = R"( + void target() { + int Foo = 1; + // [[before]] + Foo = 2; + // [[after]] + } + )"; + runDataflow( + Code, + [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, + ASTContext &ASTCtx) { + const Environment &Before = + getEnvironmentAtAnnotation(Results, "before"); + const Environment &After = getEnvironmentAtAnnotation(Results, "after"); + + const auto &ValBefore = + getValueForDecl<IntegerValue>(ASTCtx, Before, "Foo"); + const auto &ValAfter = + getValueForDecl<IntegerValue>(ASTCtx, After, "Foo"); + EXPECT_NE(&ValBefore, &ValAfter); + }); +} + TEST(TransferTest, VarDeclInitAssign) { std::string Code = R"( void target() { Index: clang/lib/Analysis/FlowSensitive/Transfer.cpp =================================================================== --- clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -775,6 +775,11 @@ Env.setValueStrict(*S, Env.getBoolLiteralValue(S->getValue())); } + void VisitIntegerLiteral(const IntegerLiteral *S) { + if (Value *Val = Env.createValue(S->getType())) + Env.setValueStrict(*S, *Val); + } + void VisitParenExpr(const ParenExpr *S) { // The CFG does not contain `ParenExpr` as top-level statements in basic // blocks, however manual traversal to sub-expressions may encounter them.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits