]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Strip all nested occurances of CCodeCastExpression
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 7 Feb 2021 18:04:56 +0000 (19:04 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 27 Feb 2021 19:19:02 +0000 (20:19 +0100)
Triggered by 63551acaf0d83fac8b50904c2759c1098fbfaa71

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

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/generics/integer-type-cast-return.vala [new file with mode: 0644]

index 171c6f0fb3eab7ae727cbcefaff28711fb5f77e7..c434ac1be0e1e54d0fbf419243e9ec4b6d86b9cd 100644 (file)
@@ -3724,9 +3724,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        }
 
                        // FIXME this breaks in our macro, so this should not happen
-                       if (cvar is CCodeCastExpression) {
+                       while (cvar is CCodeCastExpression) {
                                cvar = ((CCodeCastExpression) cvar).inner;
-                       } else if (cvar is CCodeFunctionCall) {
+                       }
+                       if (cvar is CCodeFunctionCall) {
                                cvar = ((CCodeFunctionCall) cvar).get_arguments ()[0];
                        }
 
index d162ef2fc2ba1a1a3810db0ed7952fae410b273c..1655968e72a698b1b6c8d495863f099c559fad8f 100644 (file)
@@ -654,6 +654,7 @@ TESTS = \
        generics/inference-argument-may-fail.vala \
        generics/inference-static-function.vala \
        generics/integer-type-cast.vala \
+       generics/integer-type-cast-return.vala \
        generics/parameter-invalid-initializer.test \
        generics/parameter-sizeof-initializer.vala \
        generics/member-dup-destroy.vala \
diff --git a/tests/generics/integer-type-cast-return.vala b/tests/generics/integer-type-cast-return.vala
new file mode 100644 (file)
index 0000000..b7c74d6
--- /dev/null
@@ -0,0 +1,14 @@
+T manam <T> (int i) {
+       return (int?) i;
+}
+
+T minim <T> (uint i) {
+       return (uint?) i;
+}
+
+void main () {
+       assert (manam<int?> (int.MIN) == int.MIN);
+       assert (minim<uint?> (uint.MAX) == uint.MAX);
+       assert ((int) ((int?) manam<int?> (int.MIN)) == int.MIN);
+       assert ((uint) ((uint?) minim<uint?> (uint.MAX)) == uint.MAX);
+}