]> 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>
Sun, 7 Feb 2021 18:06:52 +0000 (19:06 +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 10ebb4d5fa4b0280338e1e0cc03f3232f0208b21..d12e038f2c567675eed8b6fd59d7f454e21f1a48 100644 (file)
@@ -3768,9 +3768,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 b8b15b2cf652165ae73208c4a4af67610a860723..15d82e08690fb3de889715e6c809b34988f00001 100644 (file)
@@ -658,6 +658,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);
+}