]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix critical when using conditional expressions in method contracts
authorJürg Billeter <j@bitron.ch>
Mon, 1 Dec 2008 11:28:37 +0000 (11:28 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Mon, 1 Dec 2008 11:28:37 +0000 (11:28 +0000)
2008-12-01  Jürg Billeter  <j@bitron.ch>

* vala/valabinaryexpression.vala:
* vala/valaconditionalexpression.vala:

Fix critical when using conditional expressions in method contracts

svn path=/trunk/; revision=2109

ChangeLog
vala/valabinaryexpression.vala
vala/valaconditionalexpression.vala

index 91d29158bbc363c4487557941c9a82b3f03b5442..ea5874d81ca30e192ef518e91a2a55a51141ee2d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-01  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valabinaryexpression.vala:
+       * vala/valaconditionalexpression.vala:
+
+       Fix critical when using conditional expressions in method contracts
+
 2008-12-01  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valagobjectmodule.vala:
index 64ff3c796600546cae9ba6ee9759150b13cf2b42..f7d4dd653787c18d2da602e77a53a25efddd8084 100644 (file)
@@ -147,7 +147,10 @@ public class Vala.BinaryExpression : Expression {
 
                checked = true;
 
-               if (operator == BinaryOperator.AND || operator == BinaryOperator.OR) {
+               // some expressions are not in a block,
+               // for example, expressions in method contracts
+               if (analyzer.current_symbol is Block
+                   && (operator == BinaryOperator.AND || operator == BinaryOperator.OR)) {
                        var old_insert_block = analyzer.insert_block;
                        analyzer.insert_block = prepare_condition_split (analyzer);
 
@@ -307,6 +310,14 @@ public class Vala.BinaryExpression : Expression {
                        // integer type or flags type
 
                        value_type = left.value_type;
+               } else if (operator == BinaryOperator.AND
+                          || operator == BinaryOperator.OR) {
+                       if (!left.value_type.compatible (analyzer.bool_type) || !right.value_type.compatible (analyzer.bool_type)) {
+                               error = true;
+                               Report.error (source_reference, "Operands must be boolean");
+                       }
+
+                       value_type = analyzer.bool_type;
                } else if (operator == BinaryOperator.IN) {
                        if (left.value_type.compatible (analyzer.int_type)
                            && right.value_type.compatible (analyzer.int_type)) {
index 2d002b68b5d4c332bf49482c112e7d7c742f3f32..191d0fc0cbcae9a1183fce07e3a1b167098a825e 100644 (file)
@@ -105,6 +105,12 @@ public class Vala.ConditionalExpression : Expression {
 
                checked = true;
 
+               if (!(analyzer.current_symbol is Block)) {
+                       Report.error (source_reference, "Conditional expressions may only be used in blocks");
+                       error = true;
+                       return false;
+               }
+
                var old_insert_block = analyzer.insert_block;
                analyzer.insert_block = prepare_condition_split (analyzer);