From: Rico Tzschichholz Date: Sun, 10 May 2020 10:54:15 +0000 (+0200) Subject: vala: Transform cast from integer-type to boxed-type X-Git-Tag: 0.49.1~134 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb3c713152f6b48f87806a8aeccbb9add69ec0bf;p=thirdparty%2Fvala.git vala: Transform cast from integer-type to boxed-type Don't generate faulty c-code with results in segmentation faults. Fixes https://gitlab.gnome.org/GNOME/vala/issues/992 --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 160d77169..de2a0e032 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -22,6 +22,7 @@ TESTS_ENVIRONMENT = EXEEXT=$(EXEEXT) CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' L TESTS = \ basic-types/integers.vala \ + basic-types/integers-boxed-cast.vala \ basic-types/escape-chars.vala \ basic-types/floats.vala \ basic-types/floats-boxed-cast.vala \ @@ -574,6 +575,7 @@ TESTS = \ generics/floating-type-cast.vala \ generics/inference-argument-may-fail.vala \ generics/inference-static-function.vala \ + generics/integer-type-cast.vala \ generics/parameter-sizeof-initializer.vala \ generics/member-dup-destroy.vala \ generics/type-parameter-properties.vala \ diff --git a/tests/basic-types/integers-boxed-cast.vala b/tests/basic-types/integers-boxed-cast.vala new file mode 100644 index 000000000..b200c4aca --- /dev/null +++ b/tests/basic-types/integers-boxed-cast.vala @@ -0,0 +1,13 @@ +void main () { + var i = (int?) int.MIN; + assert (i == int.MIN); + + var u = (uint?) uint.MAX; + assert (u == uint.MAX); + + var i64 = (int64?) int64.MIN; + assert (i64 == int64.MIN); + + var u64 = (uint64?) uint64.MAX; + assert (u64 == uint64.MAX); +} diff --git a/tests/generics/integer-type-cast.vala b/tests/generics/integer-type-cast.vala new file mode 100644 index 000000000..4d7ea8ba6 --- /dev/null +++ b/tests/generics/integer-type-cast.vala @@ -0,0 +1,9 @@ +void foo (G g, T t) { + assert ((int64?) g == int64.MIN); + assert ((uint64?) t == uint64.MAX); +} + +void main () { + foo ((int64?) int64.MIN, (uint64?) uint64.MAX); + foo ((int64?) int64.MIN, (uint64?) uint64.MAX); +} diff --git a/vala/valacastexpression.vala b/vala/valacastexpression.vala index 5dc60c726..f86aad157 100644 --- a/vala/valacastexpression.vala +++ b/vala/valacastexpression.vala @@ -175,8 +175,7 @@ public class Vala.CastExpression : Expression { // Implicit transformation of stack-allocated value to heap-allocated boxed-type if (!(is_silent_cast || is_non_null_cast) && (type_reference is ValueType && type_reference.nullable) - && !inner.value_type.nullable - && inner.value_type is FloatingType) { + && inner.value_type.is_non_null_simple_type ()) { var local = new LocalVariable (type_reference, get_temp_name (), null, inner.source_reference); var decl = new DeclarationStatement (local, source_reference);