From: Rico Tzschichholz Date: Sun, 7 Feb 2021 07:57:39 +0000 (+0100) Subject: codegen: Correctly retrieve symbol_reference of nested cast expressions X-Git-Tag: 0.51.1~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65f602eee2ef37d5093c0568131e86272ee6bc9a;p=thirdparty%2Fvala.git codegen: Correctly retrieve symbol_reference of nested cast expressions Regression of 63551acaf0d83fac8b50904c2759c1098fbfaa71 Fixes https://gitlab.gnome.org/GNOME/vala/issues/1134 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index db72d5a70..10ebb4d5f 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -5441,7 +5441,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); diff --git a/tests/generics/integer-type-cast.vala b/tests/generics/integer-type-cast.vala index 4d7ea8ba6..5e3855aa5 100644 --- a/tests/generics/integer-type-cast.vala +++ b/tests/generics/integer-type-cast.vala @@ -3,7 +3,16 @@ void foo (G g, T t) { assert ((uint64?) t == uint64.MAX); } +void bar (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?) int64.MIN, (uint64?) uint64.MAX); + bar ((int?) int.MIN, (uint?) uint.MAX); + bar ((int?) int.MIN, (uint?) uint.MAX); }