]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Correctly handle cast-expression of real struct to nullable struct
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 10 May 2020 06:46:33 +0000 (08:46 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 19 May 2020 14:54:17 +0000 (16:54 +0200)
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
tests/Makefile.am
tests/structs/struct-boxed-cast.vala [new file with mode: 0644]

index b8c7f5ad7f9670f565d4a0a3b27b569b657b6b47..696e82cd3670d764a4fc7b5d86748d102613df5f 100644 (file)
@@ -5466,6 +5466,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
index e4a79691ea25d5f41b77633651dd4918840b048f..364f5898ab13ea9a8836ffde664b0fb2a790793d 100644 (file)
@@ -256,6 +256,7 @@ TESTS = \
        enums/bug780050.vala \
        structs/struct_only.vala \
        structs/struct-base-types.vala \
+       structs/struct-boxed-cast.vala \
        structs/struct-empty-still.test \
        structs/struct-initializer-list-in-array.vala \
        structs/struct-no-gtype.vala \
diff --git a/tests/structs/struct-boxed-cast.vala b/tests/structs/struct-boxed-cast.vala
new file mode 100644 (file)
index 0000000..260819d
--- /dev/null
@@ -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);
+}