[vala/0.50] codegen: Drop inner casts before converting between generics and integers



commit 54a00d6bc5c7dd901910c38a8bc37cadcd1a8903
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Wed Mar 10 12:12:06 2021 +0100

    codegen: Drop inner casts before converting between generics and integers
    
    Found by -Wpointer-to-int-cast

 codegen/valaccodebasemodule.vala          | 16 ++++++++++++++++
 tests/Makefile.am                         |  1 +
 tests/generics/integer-member-access.vala | 18 ++++++++++++++++++
 3 files changed, 35 insertions(+)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index ff67f79e3..4ad56c7a3 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 763977f59..021eb8c30 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 000000000..47dc31a13
--- /dev/null
+++ b/tests/generics/integer-member-access.vala
@@ -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);
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]