summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2014-02-01 11:22:18 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2019-03-11 13:52:38 +0100
commitb717404845106f3442d67ed34aba0b6e61c92741 (patch)
treef582063df0aec93ed8502e01f911c7967f474006
parent456e3c20ff8b412bdcf6b18cec9731197983bc52 (diff)
downloadvala-b717404845106f3442d67ed34aba0b6e61c92741.tar.gz
Use return_temp_access in coalescing expression
-rw-r--r--codegen/valaccodetransformer.vala5
-rw-r--r--vala/valabinaryexpression.vala2
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