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
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 \
--- /dev/null
+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);
+}