https://github.com/martinboehme created https://github.com/llvm/llvm-project/pull/74299
Reverts llvm/llvm-project#73978 >From 8e476a4944f7ff27b289620740b1d23aa9c57c88 Mon Sep 17 00:00:00 2001 From: martinboehme <mboe...@google.com> Date: Mon, 4 Dec 2023 11:27:14 +0100 Subject: [PATCH] =?UTF-8?q?Revert=20"[clang][dataflow]=20Retrieve=20member?= =?UTF-8?q?s=20from=20accessors=20called=20using=20member=E2=80=A6=20(#739?= =?UTF-8?q?78)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a3fe9cb24da302a40c53d187271e472a6432c4f1. --- .../FlowSensitive/DataflowEnvironment.cpp | 7 +-- .../FlowSensitive/DataflowEnvironmentTest.cpp | 51 ------------------- 2 files changed, 2 insertions(+), 56 deletions(-) diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp index b98037b736452..042402a129d10 100644 --- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -300,12 +300,9 @@ static void insertIfFunction(const Decl &D, } static MemberExpr *getMemberForAccessor(const CXXMemberCallExpr &C) { - // Use getCalleeDecl instead of getMethodDecl in order to handle - // pointer-to-member calls. - const auto *MethodDecl = dyn_cast_or_null<CXXMethodDecl>(C.getCalleeDecl()); - if (!MethodDecl) + if (!C.getMethodDecl()) return nullptr; - auto *Body = dyn_cast_or_null<CompoundStmt>(MethodDecl->getBody()); + auto *Body = dyn_cast_or_null<CompoundStmt>(C.getMethodDecl()->getBody()); if (!Body || Body->size() != 1) return nullptr; if (auto *RS = dyn_cast<ReturnStmt>(*Body->body_begin())) diff --git a/clang/unittests/Analysis/FlowSensitive/DataflowEnvironmentTest.cpp b/clang/unittests/Analysis/FlowSensitive/DataflowEnvironmentTest.cpp index c0f59c9de4131..3569b0eac7005 100644 --- a/clang/unittests/Analysis/FlowSensitive/DataflowEnvironmentTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/DataflowEnvironmentTest.cpp @@ -25,7 +25,6 @@ namespace { using namespace clang; using namespace dataflow; using ::clang::dataflow::test::getFieldValue; -using ::testing::Contains; using ::testing::IsNull; using ::testing::NotNull; @@ -312,56 +311,6 @@ TEST_F(EnvironmentTest, InitGlobalVarsConstructor) { EXPECT_THAT(Env.getValue(*Var), NotNull()); } -// Pointers to Members are a tricky case of accessor calls, complicated further -// when using templates where the pointer to the member is a template argument. -// This is a repro of a failure case seen in the wild. -TEST_F(EnvironmentTest, - ModelMemberForAccessorUsingMethodPointerThroughTemplate) { - using namespace ast_matchers; - - std::string Code = R"cc( - struct S { - int accessor() {return member;} - - int member = 0; - }; - - template <auto method> - int Target(S* S) { - return (S->*method)(); - } - - // We want to analyze the instantiation of Target for the accessor. - int Instantiator () {S S; return Target<&S::accessor>(&S); } - )cc"; - - auto Unit = - // C++17 for the simplifying use of auto in the template declaration. - tooling::buildASTFromCodeWithArgs(Code, {"-fsyntax-only", "-std=c++17"}); - auto &Context = Unit->getASTContext(); - - ASSERT_EQ(Context.getDiagnostics().getClient()->getNumErrors(), 0U); - - auto Results = match( - decl(anyOf(functionDecl(hasName("Target"), isTemplateInstantiation()) - .bind("target"), - fieldDecl(hasName("member")).bind("member"), - recordDecl(hasName("S")).bind("struct"))), - Context); - const auto *Fun = selectFirst<FunctionDecl>("target", Results); - const auto *Struct = selectFirst<RecordDecl>("struct", Results); - const auto *Member = selectFirst<FieldDecl>("member", Results); - ASSERT_THAT(Fun, NotNull()); - ASSERT_THAT(Struct, NotNull()); - ASSERT_THAT(Member, NotNull()); - - // Verify that `member` is modeled for `S` when we analyze - // `Target<&S::accessor>`. - Environment Env(DAContext, *Fun); - EXPECT_THAT(DAContext.getModeledFields(QualType(Struct->getTypeForDecl(), 0)), - Contains(Member)); -} - TEST_F(EnvironmentTest, RefreshRecordValue) { using namespace ast_matchers; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits