[llvm-branch-commits] [clang] 8e476a4 - Revert "[clang][dataflow] Retrieve members from accessors called using member… (#73978)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Dec 4 02:27:18 PST 2023
Author: martinboehme
Date: 2023-12-04T11:27:14+01:00
New Revision: 8e476a4944f7ff27b289620740b1d23aa9c57c88
URL: https://github.com/llvm/llvm-project/commit/8e476a4944f7ff27b289620740b1d23aa9c57c88
DIFF: https://github.com/llvm/llvm-project/commit/8e476a4944f7ff27b289620740b1d23aa9c57c88.diff
LOG: Revert "[clang][dataflow] Retrieve members from accessors called using member… (#73978)"
This reverts commit a3fe9cb24da302a40c53d187271e472a6432c4f1.
Added:
Modified:
clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
clang/unittests/Analysis/FlowSensitive/DataflowEnvironmentTest.cpp
Removed:
################################################################################
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 llvm-branch-commits
mailing list