[vala/0.50] codegen: Don't free unowned heap allocated struct



commit ab02c6e1d606856baf1d94b8df5f102f3d5ce574
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Mon Apr 12 09:21:48 2021 +0200

    codegen: Don't free unowned heap allocated struct
    
    Regression of 63551acaf0d83fac8b50904c2759c1098fbfaa71

 codegen/valaccodebasemodule.vala     |  3 ++-
 tests/structs/cast-struct-boxed.vala | 46 ++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
---
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 () {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]