summaryrefslogtreecommitdiff
path: root/vala
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2023-03-16 21:50:41 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2023-03-19 09:32:26 +0100
commited68b9f412bd6932e384cc8c6ac89257ae40142f (patch)
tree27ad4e6322fa643cc0ed021de1153dc3fc9a39a2 /vala
parenta902d7eae96a3f1ab0cb64f268443b23ee8ab45a (diff)
downloadvala-ed68b9f412bd6932e384cc8c6ac89257ae40142f.tar.gz
vala: Set proper value-type of unary ref/out expression in initializers
So the expected pointer-type for these expressions is available in AST. Fixes https://gitlab.gnome.org/GNOME/vala/issues/1421
Diffstat (limited to 'vala')
-rw-r--r--vala/valainitializerlist.vala5
-rw-r--r--vala/valaunaryexpression.vala7
2 files changed, 7 insertions, 5 deletions
diff --git a/vala/valainitializerlist.vala b/vala/valainitializerlist.vala
index 5b33aad45..8d3777b77 100644
--- a/vala/valainitializerlist.vala
+++ b/vala/valainitializerlist.vala
@@ -270,10 +270,7 @@ public class Vala.InitializerList : Expression {
continue;
}
- unowned UnaryExpression? unary = e as UnaryExpression;
- if (unary != null && (unary.operator == UnaryOperator.REF || unary.operator == UnaryOperator.OUT)) {
- // TODO check type for ref and out expressions
- } else if (e is NullLiteral && e.target_type != null && e.target_type.is_real_non_null_struct_type ()) {
+ if (e is NullLiteral && e.target_type != null && e.target_type.is_real_non_null_struct_type ()) {
// Allow using null instead of {} to initialize struct
} else if (!e.value_type.compatible (e.target_type)) {
error = true;
diff --git a/vala/valaunaryexpression.vala b/vala/valaunaryexpression.vala
index a725456fa..b45d7da83 100644
--- a/vala/valaunaryexpression.vala
+++ b/vala/valaunaryexpression.vala
@@ -218,7 +218,12 @@ public class Vala.UnaryExpression : Expression {
(ea != null && ea.container.value_type is ArrayType)) {
// ref and out can only be used with fields, parameters, local variables, and array element access
lvalue = true;
- value_type = inner.value_type;
+ // `ref foo` or `out foo` is used as synonym for `&foo`
+ if (parent_node is InitializerList || parent_node is MemberInitializer) {
+ value_type = new PointerType (inner.value_type, inner.source_reference);
+ } else {
+ value_type = inner.value_type;
+ }
} else {
error = true;
Report.error (source_reference, "ref and out method arguments can only be used with fields, parameters, local variables, and array element access");