]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Correctly retrieve symbol_reference of nested cast expressions
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 7 Feb 2021 07:57:39 +0000 (08:57 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 27 Feb 2021 19:16:31 +0000 (20:16 +0100)
Regression of 63551acaf0d83fac8b50904c2759c1098fbfaa71

Fixes https://gitlab.gnome.org/GNOME/vala/issues/1134

codegen/valaccodebasemodule.vala
tests/generics/integer-type-cast.vala

index c2127094d6599c4ab9b6e561255066a55746206c..171c6f0fb3eab7ae727cbcefaff28711fb5f77e7 100644 (file)
@@ -5397,7 +5397,12 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                var innercexpr = get_cvalue (expr.inner);
                if (expr.type_reference is ValueType && !expr.type_reference.nullable &&
                        expr.inner.value_type is ValueType && expr.inner.value_type.nullable) {
-                       if (!(expr.inner.symbol_reference is Variable)) {
+                       // handle nested cast expressions
+                       unowned Expression? inner_expr = expr.inner;
+                       while (inner_expr is CastExpression) {
+                               inner_expr = ((CastExpression) inner_expr).inner;
+                       }
+                       if (!(inner_expr.symbol_reference is Variable)) {
                                // heap allocated struct leaked, destroy it
                                var value = new GLibValue (new PointerType (new VoidType ()), innercexpr);
                                temp_ref_values.insert (0, value);
index 4d7ea8ba6975de7f3c8c348ee668db8b33feb005..5e3855aa5b6e142e2e799241874c50d72c62a9ba 100644 (file)
@@ -3,7 +3,16 @@ void foo<G,T> (G g, T t) {
        assert ((uint64?) t == uint64.MAX);
 }
 
+void bar<G,T> (G g, T t) {
+       assert ((int?) g == int.MIN);
+       assert ((uint?) t == uint.MAX);
+       assert ((int) ((int?) g) == int.MIN);
+       assert ((uint) ((uint?) t) == uint.MAX);
+}
+
 void main () {
        foo ((int64?) int64.MIN, (uint64?) uint64.MAX);
        foo<int64?,uint64?> ((int64?) int64.MIN, (uint64?) uint64.MAX);
+       bar ((int?) int.MIN, (uint?) uint.MAX);
+       bar<int?,uint?> ((int?) int.MIN, (uint?) uint.MAX);
 }