From: Rico Tzschichholz Date: Mon, 12 Apr 2021 07:21:48 +0000 (+0200) Subject: codegen: Don't free unowned heap allocated struct X-Git-Tag: 0.50.7~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab02c6e1d606856baf1d94b8df5f102f3d5ce574;p=thirdparty%2Fvala.git codegen: Don't free unowned heap allocated struct Regression of 63551acaf0d83fac8b50904c2759c1098fbfaa71 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 7466d5cec..985b005c7 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -5423,7 +5423,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { while (inner_expr is CastExpression) { inner_expr = ((CastExpression) inner_expr).inner; } - if (!(inner_expr.symbol_reference is Variable || inner_expr is ElementAccess)) { + if (inner_expr.value_type.value_owned + && !(inner_expr.symbol_reference is Variable || inner_expr is ElementAccess)) { // heap allocated struct leaked, destroy it var value = new GLibValue (new PointerType (new VoidType ()), innercexpr); temp_ref_values.insert (0, value); diff --git a/tests/structs/cast-struct-boxed.vala b/tests/structs/cast-struct-boxed.vala index 97ccd1d7d..86fff4064 100644 --- a/tests/structs/cast-struct-boxed.vala +++ b/tests/structs/cast-struct-boxed.vala @@ -9,6 +9,11 @@ Foo? foo_heap_owned () { return foo; } +unowned Foo? foo_heap_unowned () { + foo = { 42 }; + return foo; +} + void test_without_destroy () { { Foo f = foo_heap_owned (); @@ -22,6 +27,18 @@ void test_without_destroy () { Foo f = (!) foo_heap_owned (); assert (f.i == 23); } + { + Foo f = foo_heap_unowned (); + assert (f.i == 42); + } + { + Foo f = (Foo) foo_heap_unowned (); + assert (f.i == 42); + } + { + Foo f = (!) foo_heap_unowned (); + assert (f.i == 42); + } } struct Bar { @@ -35,6 +52,11 @@ Bar? bar_heap_owned () { return bar; } +unowned Bar? bar_heap_unowned () { + bar = { "manam" }; + return bar; +} + void test_with_destroy () { { Bar b = bar_heap_owned (); @@ -48,6 +70,30 @@ void test_with_destroy () { Bar b = (!) bar_heap_owned (); assert (b.s == "bar"); } + { + Bar b = bar_heap_unowned (); + assert (b.s == "manam"); + } + { + Bar b = (Bar) bar_heap_unowned (); + assert (b.s == "manam"); + } + { + Bar b = (!) bar_heap_unowned (); + assert (b.s == "manam"); + } + { + unowned Bar b = bar_heap_unowned (); + assert (b.s == "manam"); + } + { + unowned Bar b = (Bar) bar_heap_unowned (); + assert (b.s == "manam"); + } + { + unowned Bar b = (!) bar_heap_unowned (); + assert (b.s == "manam"); + } } void main () {