]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix arithmetic expressions whose operands have different types
authorLuca Bruno <lucabru@src.gnome.org>
Tue, 5 Jul 2011 18:24:51 +0000 (20:24 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Tue, 5 Jul 2011 18:24:51 +0000 (20:24 +0200)
tests/basic-types/floats.vala
vala/valabinaryexpression.vala

index 3294bb924fe638299094942e29079441d223320b..3f6eaa18e2e939a638d277a2377590a8ba477c2f 100644 (file)
@@ -52,6 +52,10 @@ void test_double () {
        d = double.MAX;
        assert (d == double.MAX);
        assert (d > double.MIN);
+
+       // nullable
+       double? d2 = 10;
+       assert (d2 == 10);
 }
 
 void main () {
index 2cddc2f0a5faac5bd6b3627f64d1ae598418cd9f..50d49488c634aa308cd1490fe8ce69700952e394 100644 (file)
@@ -364,9 +364,6 @@ public class Vala.BinaryExpression : Expression {
                        } else {
                                DataType resulting_type;
 
-                               left.target_type.nullable = false;
-                               right.target_type.nullable = false;
-
                                if (chained) {
                                        var lbe = (BinaryExpression) left;
                                        resulting_type = context.analyzer.get_arithmetic_result_type (lbe.right.target_type, right.target_type);
@@ -379,6 +376,13 @@ public class Vala.BinaryExpression : Expression {
                                        Report.error (source_reference, "Relational operation not supported for types `%s' and `%s'".printf (left.value_type.to_string (), right.value_type.to_string ()));
                                        return false;
                                }
+
+                               if (!chained) {
+                                       left.target_type = resulting_type.copy ();
+                               }
+                               right.target_type = resulting_type.copy ();
+                               left.target_type.nullable = false;
+                               right.target_type.nullable = false;
                        }
 
                        value_type = context.analyzer.bool_type;
@@ -393,9 +397,14 @@ public class Vala.BinaryExpression : Expression {
                                return false;
                        }
 
-                       left.target_type = left.value_type.copy ();
+                       var resulting_type = context.analyzer.get_arithmetic_result_type (left.target_type, right.target_type);
+                       if (resulting_type != null) {
+                               // numeric operation
+                               left.target_type = resulting_type.copy ();
+                               right.target_type = resulting_type.copy ();
+                       }
+
                        left.target_type.value_owned = false;
-                       right.target_type = right.value_type.copy ();
                        right.target_type.value_owned = false;
 
                        if (left.value_type.nullable != right.value_type.nullable) {