Fixes bug 685177.
var glib_value = (GLibValue) expr.inner.target_value;
var ref_value = new GLibValue (glib_value.value_type);
- ref_value.cvalue = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, glib_value.cvalue);
+ if (expr.target_type != null && glib_value.value_type.is_real_struct_type () && glib_value.value_type.nullable != expr.target_type.nullable) {
+ // the only possibility is that value_type is nullable and target_type is non-nullable
+ ref_value.cvalue = glib_value.cvalue;
+ } else {
+ ref_value.cvalue = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, glib_value.cvalue);
+ }
if (glib_value.array_length_cvalues != null) {
for (int i = 0; i < glib_value.array_length_cvalues.size; i++) {
structs/bug661945.vala \
structs/bug667890.vala \
structs/bug669580.vala \
+ structs/bug685177.vala \
delegates/delegates.vala \
delegates/bug539166.vala \
delegates/bug595610.vala \
--- /dev/null
+void non_nullable (Value v1, ref Value v2, out Value v3) {
+ v3 = v2;
+ v2 = v1;
+}
+
+void nullable (Value? v1, ref Value? v2, out Value? v3) {
+ v3 = v2;
+ v2 = null;
+}
+
+void main () {
+ Value v1 = 1;
+ Value v2 = 2;
+ Value v3;
+ non_nullable (v1, ref v2, out v3);
+ assert ((int)v1 == 1);
+ assert ((int)v2 == 1);
+ assert ((int)v3 == 2);
+
+ Value? v4 = 4;
+ Value? v5 = 5;
+ Value? v6 = 6;
+ non_nullable (v4, ref v5, out v6);
+ assert ((int)v4 == 4);
+ assert ((int)v5 == 4);
+ assert ((int)v6 == 5);
+
+ v4 = 4;
+ v5 = 5;
+ v6 = 6;
+ nullable (v4, ref v5, out v6);
+ assert ((int)v4 == 4);
+ assert (v5 == null);
+ assert ((int)v6 == 5);
+}