[vala/0.40] codegen: Correctly handle cast-expression of real struct to nullable struct
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.40] codegen: Correctly handle cast-expression of real struct to nullable struct
- Date: Tue, 19 May 2020 16:29:03 +0000 (UTC)
commit d868972188f0bc5b3acb5bc6567fbfb4cda275a1
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Sun May 10 08:46:33 2020 +0200
codegen: Correctly handle cast-expression of real struct to nullable struct
Don't generate invalid c-code leading to "cannot convert to a pointer type"
Fix https://gitlab.gnome.org/GNOME/vala/issues/991
codegen/valaccodebasemodule.vala | 4 ++++
tests/Makefile.am | 1 +
tests/structs/struct-boxed-cast.vala | 21 +++++++++++++++++++++
vala/valadatatype.vala | 8 ++++++++
4 files changed, 34 insertions(+)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index bbdec7c4e..ab142f01d 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5455,6 +5455,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
expr.inner.value_type is ValueType && expr.inner.value_type.nullable) {
// nullable integer or float or boolean or struct or enum cast to non-nullable
innercexpr = new CCodeUnaryExpression
(CCodeUnaryOperator.POINTER_INDIRECTION, innercexpr);
+ } else if (expr.type_reference is ValueType && expr.type_reference.nullable &&
+ expr.inner.value_type.is_real_non_null_struct_type ()) {
+ // real non-null struct cast to nullable
+ innercexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF,
innercexpr);
} else if (expr.type_reference is ArrayType && !(expr.inner is Literal)
&& expr.inner.value_type is ValueType && !expr.inner.value_type.nullable) {
// integer or float or boolean or struct or enum to array cast
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ccc76c410..fffb69cbd 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -237,6 +237,7 @@ TESTS = \
enums/bug780050.vala \
structs/struct_only.vala \
structs/struct-base-types.vala \
+ structs/struct-boxed-cast.vala \
structs/struct-initializer-list-in-array.vala \
structs/structs.vala \
structs/constructor-wrong-name.test \
diff --git a/tests/structs/struct-boxed-cast.vala b/tests/structs/struct-boxed-cast.vala
new file mode 100644
index 000000000..260819dcf
--- /dev/null
+++ b/tests/structs/struct-boxed-cast.vala
@@ -0,0 +1,21 @@
+void foo<T> (T t) {
+ assert (((Bar?) t).s == "foo");
+ assert (((Bar?) t).i == 23);
+}
+
+struct Bar {
+ public string s;
+ public int i;
+}
+
+void main () {
+ Bar f = { "bar", 42 };
+ var cast = (Bar?) f;
+ assert (cast.s == "bar");
+ assert (cast.i == 42);
+
+ Bar arg = { "foo", 23 };
+ foo ((Bar?) arg);
+ foo<Bar?> (arg);
+ foo<Bar?> ((Bar?) arg);
+}
diff --git a/vala/valadatatype.vala b/vala/valadatatype.vala
index ca9d3a61a..ab332f734 100644
--- a/vala/valadatatype.vala
+++ b/vala/valadatatype.vala
@@ -431,6 +431,14 @@ public abstract class Vala.DataType : CodeNode {
return is_real_struct_type () && !nullable;
}
+ public bool is_non_null_simple_type () {
+ unowned Struct s = data_type as Struct;
+ if (s != null && s.is_simple_type ()) {
+ return !nullable;
+ }
+ return false;
+ }
+
/**
* Returns whether the value needs to be disposed, i.e. whether
* allocated memory or other resources need to be released when
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]