diff options
-rw-r--r-- | codegen/valaccodetransformer.vala | 5 | ||||
-rw-r--r-- | vala/valabinaryexpression.vala | 2 |
2 files changed, 5 insertions, 2 deletions
diff --git a/codegen/valaccodetransformer.vala b/codegen/valaccodetransformer.vala index ee346cec8..904318f64 100644 --- a/codegen/valaccodetransformer.vala +++ b/codegen/valaccodetransformer.vala @@ -444,12 +444,13 @@ public class Vala.CCodeTransformer : CodeTransformer { replacement = expression (result); } else if (expr.operator == BinaryOperator.COALESCE) { var is_owned = expr.left.value_type.value_owned || expr.right.value_type.value_owned; - var result = b.add_temp_declaration (copy_type (expr.value_type, is_owned, true), expr.left); + var result = b.add_temp_declaration (copy_type (expr.value_type), expr.left); b.open_if (expression (@"$result == null")); b.add_assignment (expression (result), expr.right); b.close (); - replacement = expression (result); + + replacement = return_temp_access (result, expr.value_type, target_type); } else if (expr.operator == BinaryOperator.IN && !(expr.left.value_type.compatible (context.analyzer.int_type) && expr.right.value_type.compatible (context.analyzer.int_type)) && !(expr.right.value_type is ArrayType)) { // neither enums nor array, it's contains() var call = new MethodCall (new MemberAccess (expr.right, "contains", expr.source_reference), expr.source_reference); diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala index 229c44861..4f6d97b34 100644 --- a/vala/valabinaryexpression.vala +++ b/vala/valabinaryexpression.vala @@ -194,6 +194,8 @@ public class Vala.BinaryExpression : Expression { if (operator == BinaryOperator.COALESCE) { left.target_type.nullable = true; + left.target_type.value_owned = left.value_type.value_owned || right.value_type.value_owned; + right.target_type = left.target_type.copy (); value_type = left.target_type.copy (); } else if (left.value_type.data_type == context.analyzer.string_type.data_type |