From: Rico Tzschichholz Date: Wed, 10 Mar 2021 11:12:06 +0000 (+0100) Subject: codegen: Drop inner casts before converting between generics and integers X-Git-Tag: 0.51.91~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f969ed96471f224a7bb8774ee23801ebe39ef1f8;p=thirdparty%2Fvala.git codegen: Drop inner casts before converting between generics and integers Found by -Wpointer-to-int-cast --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index ae6fddbf3..308aa034e 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -6003,8 +6003,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; @@ -6014,8 +6022,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 b22e19768..6e7bd28b8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -675,6 +675,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 { + public K k; + public V v; +} + +void main () { + var foo = new Foo (); + foo.k = int.MIN; + foo.v = uint.MAX; + assert (foo.k == int.MIN); + assert (foo.v == uint.MAX); + + var bar = new Foo (); + bar.k = foo.k; + bar.v = foo.v; + assert (bar.k == int.MIN); + assert (bar.v == uint.MAX); +}