================
@@ -1202,5 +1202,242 @@ TEST_F(LifetimeAnalysisTest, LivenessOutsideLoop) {
EXPECT_THAT(Origins({"p"}), MaybeLiveAt("p1"));
}
+TEST_F(LifetimeAnalysisTest, SimpleReturnStackAddress) {
+ SetupTest(R"(
+ MyObj* target() {
+ MyObj s;
+ MyObj* p = &s;
+ POINT(p1);
+ return p;
+ }
+ )");
+ EXPECT_THAT(Origin("p"), HasLoansTo({"s"}, "p1"));
+ EXPECT_THAT(Origins({"p"}), MustBeLiveAt("p1"));
+}
+
+TEST_F(LifetimeAnalysisTest, ConditionalAssignUnconditionalReturn) {
+ SetupTest(R"(
+ MyObj* target(bool c) {
+ MyObj s1;
+ MyObj* p = nullptr;
+ POINT(before_if);
+ if (c) {
+ p = &s1;
+ POINT(after_assign);
+ }
+ POINT(after_if);
+ return p;
+ }
+ )");
+ EXPECT_THAT(Origin("p"), HasLoansTo({"s1"}, "after_if"));
+ EXPECT_THAT(Origins({"p"}), MustBeLiveAt("after_if"));
+
+ EXPECT_THAT(Origin("p"), HasLoansTo({"s1"}, "after_assign"));
+ EXPECT_THAT(Origins({"p"}), MustBeLiveAt("after_assign"));
+
+ EXPECT_THAT(Origin("p"), HasLoansTo({}, "before_if"));
+ EXPECT_THAT(Origins({"p"}), MaybeLiveAt("before_if"));
+}
+
+TEST_F(LifetimeAnalysisTest, ConditionalAssignBothBranches) {
+ SetupTest(R"(
+ MyObj* target(bool c) {
+ MyObj s1;
+ static MyObj s2;
+ MyObj* p = nullptr;
+ POINT(before_if);
+ if (c) {
+ p = &s1;
+ POINT(after_assign_if);
+ } else {
+ p = &s2;
+ POINT(after_assign_else);
+ }
+ POINT(after_if);
+ return p;
+ }
+ )");
+ EXPECT_THAT(Origin("p"), HasLoansTo({"s1", "s2"}, "after_if"));
+ EXPECT_THAT(Origins({"p"}), MustBeLiveAt("after_if"));
+
+ EXPECT_THAT(Origin("p"), HasLoansTo({"s1"}, "after_assign_if"));
+ EXPECT_THAT(Origins({"p"}), MustBeLiveAt("after_assign_if"));
+
+ EXPECT_THAT(Origin("p"), HasLoansTo({"s2"}, "after_assign_else"));
+ EXPECT_THAT(Origins({"p"}), MustBeLiveAt("after_assign_else"));
+
+ EXPECT_THAT(Origin("p"), HasLoansTo({}, "before_if"));
+ EXPECT_THAT(NoOrigins(), AreLiveAt("before_if"));
+}
+
+TEST_F(LifetimeAnalysisTest, ReassignFromSafeToLocalThenReturn) {
+ SetupTest(R"(
+ MyObj* target() {
+ static MyObj safe_obj;
+ MyObj local_obj;
+ MyObj* p = &safe_obj;
+ POINT(p1);
+
+ p = &local_obj;
+ POINT(p2);
+ return p;
+ }
+ )");
+
+ EXPECT_THAT(Origin("p"), HasLoansTo({"local_obj"}, "p2"));
+ EXPECT_THAT(Origins({"p"}), MustBeLiveAt("p2"));
+
+ EXPECT_THAT(Origin("p"), HasLoansTo({"safe_obj"}, "p1"));
+ EXPECT_THAT(NoOrigins(), AreLiveAt("p1"));
+}
+
+TEST_F(LifetimeAnalysisTest, PointerChainToLocal) {
+ SetupTest(R"(
+ MyObj* target() {
+ MyObj local_obj;
+ MyObj* p1 = &local_obj;
+ POINT(p_p1);
+ MyObj* p2 = p1;
+ POINT(p_p2);
+ return p2;
+ }
+ )");
+ EXPECT_THAT(Origin("p2"), HasLoansTo({"local_obj"}, "p_p2"));
+ EXPECT_THAT(Origins({"p2"}), MustBeLiveAt("p_p2"));
+ EXPECT_THAT(Origins({"p1"}), testing::Not(AreLiveAt("p_p2")));
+
+ EXPECT_THAT(Origin("p1"), HasLoansTo({"local_obj"}, "p_p1"));
+ EXPECT_THAT(Origins({"p1"}), MustBeLiveAt("p_p1"));
+}
+
+TEST_F(LifetimeAnalysisTest, MultipleAssignmentMultipleReturn) {
+ SetupTest(R"(
+ MyObj* target(bool c1, bool c2) {
+ static MyObj global_obj;
----------------
usx95 wrote:
nit: fix indent
https://github.com/llvm/llvm-project/pull/165370
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits