diff --git a/clang/unittests/Analysis/FlowSensitive/TestingSupport.h b/clang/unittests/Analysis/FlowSensitive/TestingSupport.h index 11dc4ed76aa4f..44dbf27a74586 100644 --- a/clang/unittests/Analysis/FlowSensitive/TestingSupport.h +++ b/clang/unittests/Analysis/FlowSensitive/TestingSupport.h @@ -402,8 +402,8 @@ llvm::Error checkDataflowWithNoopAnalysis( std::function< void(const llvm::StringMap> &, ASTContext &)> - VerifyResults, - DataflowAnalysisOptions Options, + VerifyResults = [](const auto &, auto &) {}, + DataflowAnalysisOptions Options = {BuiltinOptions()}, LangStandard::Kind Std = LangStandard::lang_cxx17, llvm::StringRef TargetFun = "target"); diff --git a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp index 117230e14aa9e..4c31de3c8085b 100644 --- a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -2667,11 +2667,7 @@ TEST(TransferTest, CannotAnalyzeFunctionTemplate) { void target() {} )"; ASSERT_THAT_ERROR( - checkDataflowWithNoopAnalysis( - Code, - [](const llvm::StringMap> &Results, - ASTContext &ASTCtx) {}, - {BuiltinOptions()}), + checkDataflowWithNoopAnalysis(Code), llvm::FailedWithMessage("Cannot analyze templated declarations")); } @@ -2683,11 +2679,7 @@ TEST(TransferTest, CannotAnalyzeMethodOfClassTemplate) { }; )"; ASSERT_THAT_ERROR( - checkDataflowWithNoopAnalysis( - Code, - [](const llvm::StringMap> &Results, - ASTContext &ASTCtx) {}, - {BuiltinOptions()}), + checkDataflowWithNoopAnalysis(Code), llvm::FailedWithMessage("Cannot analyze templated declarations")); } @@ -3836,6 +3828,52 @@ TEST(TransferTest, LoopWithStructReferenceAssignmentConverges) { }); } +TEST(TransferTest, LoopDereferencingChangingPointerConverges) { + std::string Code = R"cc( + bool some_condition(); + + void target(int i1, int i2) { + int *p = &i1; + while (true) { + (void)*p; + if (some_condition()) + p = &i1; + else + p = &i2; + } + } + )cc"; + // FIXME: Implement pointer value widening to make analysis converge. + ASSERT_THAT_ERROR( + checkDataflowWithNoopAnalysis(Code), + llvm::FailedWithMessage("maximum number of iterations reached")); +} + +TEST(TransferTest, LoopDereferencingChangingRecordPointerConverges) { + std::string Code = R"cc( + struct Lookup { + int x; + }; + + bool some_condition(); + + void target(Lookup l1, Lookup l2) { + Lookup *l = &l1; + while (true) { + (void)l->x; + if (some_condition()) + l = &l1; + else + l = &l2; + } + } + )cc"; + // FIXME: Implement pointer value widening to make analysis converge. + ASSERT_THAT_ERROR( + checkDataflowWithNoopAnalysis(Code), + llvm::FailedWithMessage("maximum number of iterations reached")); +} + TEST(TransferTest, DoesNotCrashOnUnionThisExpr) { std::string Code = R"( union Union {