]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Drop inner casts before converting between generics and integers
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 10 Mar 2021 11:12:06 +0000 (12:12 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 13 Mar 2021 20:43:33 +0000 (21:43 +0100)
Found by -Wpointer-to-int-cast

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/generics/integer-member-access.vala [new file with mode: 0644]

index ff67f79e3029f4312c2405b4983a89a9692dfe7e..4ad56c7a3a035ab22148814ea3b450a019c5803c 100644 (file)
@@ -5953,8 +5953,16 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        generate_type_declaration (actual_type, cfile);
                        result = new CCodeCastExpression (cexpr, get_ccode_name (actual_type));
                } else if (analyzer.is_signed_integer_type_argument (actual_type)) {
+                       // FIXME this should not happen
+                       while (cexpr is CCodeCastExpression) {
+                               cexpr = ((CCodeCastExpression) cexpr).inner;
+                       }
                        result = new CCodeCastExpression (new CCodeCastExpression (cexpr, "gintptr"), get_ccode_name (actual_type));
                } else if (analyzer.is_unsigned_integer_type_argument (actual_type)) {
+                       // FIXME this should not happen
+                       while (cexpr is CCodeCastExpression) {
+                               cexpr = ((CCodeCastExpression) cexpr).inner;
+                       }
                        result = new CCodeCastExpression (new CCodeCastExpression (cexpr, "guintptr"), get_ccode_name (actual_type));
                }
                return result;
@@ -5964,8 +5972,16 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                unowned SemanticAnalyzer analyzer = context.analyzer;
                var result = cexpr;
                if (analyzer.is_signed_integer_type_argument (actual_type)) {
+                       // FIXME this should not happen
+                       while (cexpr is CCodeCastExpression) {
+                               cexpr = ((CCodeCastExpression) cexpr).inner;
+                       }
                        result = new CCodeCastExpression (new CCodeCastExpression (cexpr, "gintptr"), get_ccode_name (pointer_type));
                } else if (analyzer.is_unsigned_integer_type_argument (actual_type)) {
+                       // FIXME this should not happen
+                       while (cexpr is CCodeCastExpression) {
+                               cexpr = ((CCodeCastExpression) cexpr).inner;
+                       }
                        result = new CCodeCastExpression (new CCodeCastExpression (cexpr, "guintptr"), get_ccode_name (pointer_type));
                }
                return result;
index 763977f59e7a94c3058ff153535965c5a0eb7e14..021eb8c30d91b78030ae5a73b5af582ce39af39b 100644 (file)
@@ -667,6 +667,7 @@ TESTS = \
        generics/gvariant-serialization.test \
        generics/inference-argument-may-fail.vala \
        generics/inference-static-function.vala \
+       generics/integer-member-access.vala \
        generics/integer-type-cast.vala \
        generics/integer-type-cast-return.vala \
        generics/parameter-invalid-initializer.test \
diff --git a/tests/generics/integer-member-access.vala b/tests/generics/integer-member-access.vala
new file mode 100644 (file)
index 0000000..47dc31a
--- /dev/null
@@ -0,0 +1,18 @@
+class Foo<K,V> {
+       public K k;
+       public V v;
+}
+
+void main () {
+       var foo = new Foo<int,uint> ();
+       foo.k = int.MIN;
+       foo.v = uint.MAX;
+       assert (foo.k == int.MIN);
+       assert (foo.v == uint.MAX);
+
+       var bar = new Foo<int,uint> ();
+       bar.k = foo.k;
+       bar.v = foo.v;
+       assert (bar.k == int.MIN);
+       assert (bar.v == uint.MAX);
+}