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.50.5~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=54a00d6bc5c7dd901910c38a8bc37cadcd1a8903;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 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 { + 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); +}