[vala/0.50] codegen: Drop inner casts before converting between generics and integers
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.50] codegen: Drop inner casts before converting between generics and integers
- Date: Sun, 14 Mar 2021 15:47:54 +0000 (UTC)
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]