From 54a00d6bc5c7dd901910c38a8bc37cadcd1a8903 Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Wed, 10 Mar 2021 12:12:06 +0100 Subject: [PATCH] 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(+) create mode 100644 tests/generics/integer-member-access.vala 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); +} -- 2.47.2