vala r2109 - in trunk: . vala



Author: juergbi
Date: Mon Dec  1 11:28:37 2008
New Revision: 2109
URL: http://svn.gnome.org/viewvc/vala?rev=2109&view=rev

Log:
2008-12-01  JÃrg Billeter  <j bitron ch>

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

	Fix critical when using conditional expressions in method contracts


Modified:
   trunk/ChangeLog
   trunk/vala/valabinaryexpression.vala
   trunk/vala/valaconditionalexpression.vala

Modified: trunk/vala/valabinaryexpression.vala
==============================================================================
--- trunk/vala/valabinaryexpression.vala	(original)
+++ trunk/vala/valabinaryexpression.vala	Mon Dec  1 11:28:37 2008
@@ -147,7 +147,10 @@
 
 		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 @@
 			// 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)) {

Modified: trunk/vala/valaconditionalexpression.vala
==============================================================================
--- trunk/vala/valaconditionalexpression.vala	(original)
+++ trunk/vala/valaconditionalexpression.vala	Mon Dec  1 11:28:37 2008
@@ -105,6 +105,12 @@
 
 		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);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]