diff options
author | Luca Bruno <lucabru@src.gnome.org> | 2014-01-26 12:10:57 +0100 |
---|---|---|
committer | Luca Bruno <lucabru@src.gnome.org> | 2014-01-26 12:12:20 +0100 |
commit | 6949360735ce69776f3e64d25fc3efab5ce387e5 (patch) | |
tree | 2852edd0a6846aa30887f9f9a9d49f562ab4e45a | |
parent | 603c1c792adf538125e17e8bf70804c97e96a8f5 (diff) | |
download | vala-6949360735ce69776f3e64d25fc3efab5ce387e5.tar.gz |
Fix semantics for coalesce operator when target_type is null.
Fixes bug 639482
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/control-flow/bug639482.vala | 4 | ||||
-rw-r--r-- | vala/valabinaryexpression.vala | 14 |
3 files changed, 16 insertions, 3 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 85a92139b..5d89abfe7 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -63,6 +63,7 @@ TESTS = \ control-flow/foreach.vala \ control-flow/switch.vala \ control-flow/sideeffects.vala \ + control-flow/bug639482.vala \ control-flow/bug652549.vala \ control-flow/bug665904.vala \ control-flow/bug691514.vala \ diff --git a/tests/control-flow/bug639482.vala b/tests/control-flow/bug639482.vala new file mode 100644 index 000000000..27a8e20ba --- /dev/null +++ b/tests/control-flow/bug639482.vala @@ -0,0 +1,4 @@ +void main () { + string empty = null; + assert ((false ? "A" : (empty ?? "B")) == "B"); +} diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala index 2b7289c05..19766e12f 100644 --- a/vala/valabinaryexpression.vala +++ b/vala/valabinaryexpression.vala @@ -221,10 +221,18 @@ public class Vala.BinaryExpression : Expression { } var ma = new MemberAccess.simple (local.name, source_reference); - ma.target_type = target_type; - ma.check (context); + Expression replace = ma; - parent_node.replace_expression (this, ma); + if (target_type == null) { + replace = new ReferenceTransferExpression (replace, source_reference); + replace.target_type = local.variable_type.copy (); + replace.target_type.value_owned = true; + } else { + replace.target_type = target_type.copy (); + } + replace.check (context); + + parent_node.replace_expression (this, replace); return true; } |