From 31cc8f32e2a50f996595ad7903f21a0636f6a3ad Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 2 May 2021 23:00:38 +0200 Subject: [PATCH] Fixed #787 - the results of const reference return values need to be copied as the holder object may go out of scope --- src/db/unit_tests/dbLayoutQueryTests.cc | 21 +++++++++++++++++++++ src/gsi/gsi/gsiExpression.cc | 7 +++++++ src/tl/unit_tests/tlExpressionTests.cc | 21 +++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/src/db/unit_tests/dbLayoutQueryTests.cc b/src/db/unit_tests/dbLayoutQueryTests.cc index 98ed65049..a944bd61b 100644 --- a/src/db/unit_tests/dbLayoutQueryTests.cc +++ b/src/db/unit_tests/dbLayoutQueryTests.cc @@ -1488,3 +1488,24 @@ TEST(63) EXPECT_EQ (g.under_construction (), false); } + +// issue-787 +TEST(64) +{ + db::Layout g; + init_layout (g); + + { + db::LayoutQuery q ("select inst.dtrans from instances of .*.*"); + db::LayoutQueryIterator iq (q, &g); + std::string s = q2s_var (iq, "data"); + EXPECT_EQ (s, "r0 0.01,-0.02,m45 -0.01,0.02,m45 -0.01,0.02,m45 -0.01,0.02,r0 0.01,-0.02,m45 -0.01,0.02"); + } + + { + db::LayoutQuery q ("select inst.dtrans.disp.x,inst.dtrans.disp.y from instances of .*.*"); + db::LayoutQueryIterator iq (q, &g); + std::string s = q2s_var (iq, "data"); + EXPECT_EQ (s, "0.01,-0.02,-0.01,0.02,-0.01,0.02,-0.01,0.02,0.01,-0.02,-0.01,0.02"); + } +} diff --git a/src/gsi/gsi/gsiExpression.cc b/src/gsi/gsi/gsiExpression.cc index 4bf00218f..1836f5899 100644 --- a/src/gsi/gsi/gsiExpression.cc +++ b/src/gsi/gsi/gsiExpression.cc @@ -901,6 +901,13 @@ struct reader tl_assert (cls != 0); *out = tl::Variant (); + + // consider prefer_copy + if (! owner && atype.prefer_copy () && !clsact->is_managed () && clsact->can_copy ()) { + obj = clsact->clone (obj); + owner = true; + } + out->set_user (obj, cls, owner); } diff --git a/src/tl/unit_tests/tlExpressionTests.cc b/src/tl/unit_tests/tlExpressionTests.cc index 6c361fb6d..619b5a351 100644 --- a/src/tl/unit_tests/tlExpressionTests.cc +++ b/src/tl/unit_tests/tlExpressionTests.cc @@ -1189,3 +1189,24 @@ TEST(19) v = e.parse ("# A comment\nvar i=CellInstArray.new(17,tr,a,b,100,200); i.to_s(); # A final comment").execute (); EXPECT_EQ (v.to_string (), std::string ("#17 r90 10,20 [1,2*100;11,22*200]")); } + +// issue-787 +TEST(20) +{ + tl::Eval e; + e.parse ("var ly=Layout.new(true)").execute (); + e.parse ("var top=ly.create_cell('TOP')").execute (); + e.parse ("var cell=ly.create_cell('CHILD')").execute (); + e.parse ("var i1 = top.insert(CellInstArray.new(cell.cell_index,Trans.new(Vector.new(100,200))))").execute (); + e.parse ("var i2 = top.insert(CellInstArray.new(cell.cell_index,Trans.new(Vector.new(-100,300))))").execute (); + + tl::Variant v; + v = e.parse ("i1.dtrans.disp.x").execute (); + EXPECT_EQ (v.to_string (), std::string ("0.1")); + v = e.parse ("i1.dtrans.disp.y").execute (); + EXPECT_EQ (v.to_string (), std::string ("0.2")); + v = e.parse ("i2.dtrans.disp.x").execute (); + EXPECT_EQ (v.to_string (), std::string ("-0.1")); + v = e.parse ("i2.dtrans.disp.y").execute (); + EXPECT_EQ (v.to_string (), std::string ("0.3")); +}