[clang] Revert "[clang][dataflow] Retrieve members from accessors called using member…" (PR #74299)

via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 4 02:27:29 PST 2023


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 <mboehme at 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;
 



More information about the cfe-commits mailing list