]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Don't falsely resolve binary-expression to bool e679740751b4fde1d40103f8a84fba0fed1ff9a2
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 24 Oct 2019 12:15:56 +0000 (14:15 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 24 Oct 2019 12:34:08 +0000 (14:34 +0200)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/869

tests/Makefile.am
tests/control-semantic/condition-not-boolean.test [new file with mode: 0644]
tests/control-semantic/expression-not-boolean.test [new file with mode: 0644]
vala/valabinaryexpression.vala

index b2a740c13a3433699e95832646519110eadf705f..a80d7a27a6e46e40bbe74d0457c799027efad2d9 100644 (file)
@@ -201,6 +201,8 @@ TESTS = \
        control-semantic/argument-owned-ref.test \
        control-semantic/argument-value-out.test \
        control-semantic/argument-value-ref.test \
+       control-semantic/condition-not-boolean.test \
+       control-semantic/expression-not-boolean.test \
        control-semantic/literal-immutable.test \
        control-semantic/member-incompatible-type.test \
        control-semantic/member-invalid.test \
diff --git a/tests/control-semantic/condition-not-boolean.test b/tests/control-semantic/condition-not-boolean.test
new file mode 100644 (file)
index 0000000..7ba2130
--- /dev/null
@@ -0,0 +1,7 @@
+Invalid Code
+
+void main () {
+       if (true != false & 0) {
+               assert_not_reached ();
+       }
+}
diff --git a/tests/control-semantic/expression-not-boolean.test b/tests/control-semantic/expression-not-boolean.test
new file mode 100644 (file)
index 0000000..2be02e9
--- /dev/null
@@ -0,0 +1,5 @@
+Invalid Code
+
+void main () {
+       bool foo = true != false & 0;
+}
index bfabcf5aa6ce75f8c026a7807bef86deb831b317..f9b66e377292585d853084636680fbc23b964203 100644 (file)
@@ -511,7 +511,13 @@ public class Vala.BinaryExpression : Expression {
                        left.target_type.nullable = false;
                        right.target_type.nullable = false;
 
-                       value_type = left.target_type.copy ();
+                       // Don't falsely resolve to bool
+                       if (left.value_type.compatible (context.analyzer.bool_type)
+                           && !right.value_type.compatible (context.analyzer.bool_type)) {
+                               value_type = right.target_type.copy ();
+                       } else {
+                               value_type = left.target_type.copy ();
+                       }
                        break;
                case BinaryOperator.AND:
                case BinaryOperator.OR: