https://github.com/ziqingluo-90 updated https://github.com/llvm/llvm-project/pull/205937
>From b0735fd3095ca61bc75d13c098eb3447e24b551e Mon Sep 17 00:00:00 2001 From: Ziqing Luo <[email protected]> Date: Thu, 25 Jun 2026 15:16:32 -0700 Subject: [PATCH 1/2] [SSAF][PointerFlow] Upstream Reference-to-pointer binding tests The majority of the content of rdar://179151476 duplicates the PointerFlow analysis after https://github.com/llvm/llvm-project/pull/203633. Therefore, we only need to upstream the tests for better test coverage and proving the duplication. rdar://179151476 --- .../Analyses/PointerFlow/PointerFlowTest.cpp | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp b/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp index 1c42ca0afe222..0a155a30c99f7 100644 --- a/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp +++ b/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp @@ -1440,4 +1440,138 @@ TEST_F(PointerFlowTest, ReturnRefPtr) { EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"foo", 1U, true}, {"f", 1U, true}}})); } +TEST_F(PointerFlowTest, RefBindVarInitFileScope) { + ASSERT_TRUE(setUpTest(R"cpp( + int *gp; + int *& gr = gp; + )cpp")); + + auto *Sum = getEntitySummary<VarDecl>("gr"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"gr", 1U}, {"gp", 1U}}})); +} + +TEST_F(PointerFlowTest, RefBindCallArgMultiple) { + ASSERT_TRUE(setUpTest(R"cpp( + void h(int *& a, int *& b); + void f(int *p, int *q) { h(p, q); } + )cpp")); + + auto *Sum = getEntitySummary("f"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, { + {{"a", 1U}, {"p", 1U}}, + {{"b", 1U}, {"q", 1U}}, + })); +} + +TEST_F(PointerFlowTest, RefBindCallArgDefaulted) { + ASSERT_TRUE(setUpTest(R"cpp( + int *global_default; + void h(int *& x = global_default); + void f() { h(); } + )cpp")); + + auto *Sum = getEntitySummary("f"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, + makeEdges(__LINE__, {{{"x", 1U}, {"global_default", 1U}}})); +} + +TEST_F(PointerFlowTest, RefBindMemberInit) { + ASSERT_TRUE(setUpTest(R"cpp( + struct S { int *& m; S(int *& p) : m(p) {} }; + )cpp")); + + auto *Sum = getEntitySummary<CXXConstructorDecl>("S"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"m", 1U}, {"p", 1U}}})); +} + +TEST_F(PointerFlowTest, RefBindReturnStmt) { + ASSERT_TRUE(setUpTest(R"cpp( + int *& f(int *& p) { return p; } + )cpp")); + + auto *Sum = getEntitySummary("f"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"f", 1U, true}, {"p", 1U}}})); +} + +TEST_F(PointerFlowTest, RefBindMultiLevel) { + ASSERT_TRUE(setUpTest(R"cpp( + int **gpp; + int **& r = gpp; + )cpp")); + + auto *Sum = getEntitySummary<VarDecl>("r"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"r", 1U}, {"gpp", 1U}}})); +} + +TEST_F(PointerFlowTest, RefBindTernaryInit) { + ASSERT_TRUE(setUpTest(R"cpp( + void f(bool cond, int *p, int *q) { + int *& r = (cond ? p : q); + (void)r; + } + )cpp")); + + auto *Sum = getEntitySummary("f"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, { + {{"r", 1U}, {"p", 1U}}, + {{"r", 1U}, {"q", 1U}}, + })); +} + +TEST_F(PointerFlowTest, RefBindNonPointerReferenceIgnored) { + ASSERT_TRUE(setUpTest(R"cpp( + void f() { int x = 0; int &r = x; (void)r; } + )cpp")); + + EXPECT_EQ(getEntitySummary("f"), nullptr); +} + +TEST_F(PointerFlowTest, RefBindArraySubscriptInInitializer) { + ASSERT_TRUE(setUpTest(R"cpp( + void f(int *arr[], int i) { int *& r = arr[i]; (void)r; } + )cpp")); + + auto *Sum = getEntitySummary("f"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"r", 1U}, {"arr", 2U}}})); +} + +TEST_F(PointerFlowTest, RefBindExplicitCastInInitializer) { + ASSERT_TRUE(setUpTest(R"cpp( + void f(int *p) { int *& r = (int *&)p; (void)r; } + )cpp")); + + auto *Sum = getEntitySummary("f"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"r", 1U}, {"p", 1U}}})); +} + +TEST_F(PointerFlowTest, RefBindFunctionCallInitializer) { + ASSERT_TRUE(setUpTest(R"cpp( + int *& g(); + void f() { int *& r = g(); (void)r; } + )cpp")); + + auto *Sum = getEntitySummary("f"); + + ASSERT_NE(Sum, nullptr); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"r", 1U}, {"g", 1U, true}}})); +} + } // namespace >From 4e5cceca124ddae6243ce7389d6161eb4d605cbe Mon Sep 17 00:00:00 2001 From: Ziqing Luo <[email protected]> Date: Fri, 26 Jun 2026 10:51:35 -0700 Subject: [PATCH 2/2] fix clang-format --- .../Analyses/PointerFlow/PointerFlowTest.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp b/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp index 0a155a30c99f7..b6d2b8b1af3cf 100644 --- a/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp +++ b/clang/unittests/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowTest.cpp @@ -1477,8 +1477,7 @@ TEST_F(PointerFlowTest, RefBindCallArgDefaulted) { auto *Sum = getEntitySummary("f"); ASSERT_NE(Sum, nullptr); - EXPECT_EQ(*Sum, - makeEdges(__LINE__, {{{"x", 1U}, {"global_default", 1U}}})); + EXPECT_EQ(*Sum, makeEdges(__LINE__, {{{"x", 1U}, {"global_default", 1U}}})); } TEST_F(PointerFlowTest, RefBindMemberInit) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
