]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix crash with invalid return values, fixes bug 549996
authorJürg Billeter <j@bitron.ch>
Sat, 25 Oct 2008 14:54:29 +0000 (14:54 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 25 Oct 2008 14:54:29 +0000 (14:54 +0000)
2008-10-25  Jürg Billeter  <j@bitron.ch>

* vala/valasemanticanalyzer.vala:

Fix crash with invalid return values, fixes bug 549996

svn path=/trunk/; revision=1920

ChangeLog
vala/valasemanticanalyzer.vala

index 30aa7c5ec4e246bcd6b8379ab2c34e51da8a9fe5..0d07ece1578c3a8ce9a4e848fa9c2c43849ebf2e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-10-25  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valasemanticanalyzer.vala:
+
+       Fix crash with invalid return values, fixes bug 549996
+
 2008-10-25  Jürg Billeter  <j@bitron.ch>
 
        * vala/valaerrorcode.vala:
index ff3fbcaf311421f7483809b64381fcaebc7767c0..8ad930dca37c3e8942e37d1f01b28255e83e49c3 100644 (file)
@@ -1198,33 +1198,41 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                        return;
                }
 
-               if (stmt.return_expression == null && !(current_return_type is VoidType)) {
-                       stmt.error = true;
-                       Report.error (stmt.source_reference, "Return without value in non-void function");
-                       return;
+               if (stmt.return_expression == null) {
+                       if (current_return_type is VoidType) {
+                               return;
+                       } else {
+                               stmt.error = true;
+                               Report.error (stmt.source_reference, "Return without value in non-void function");
+                               return;
+                       }
                }
 
-               if (stmt.return_expression != null && current_return_type is VoidType) {
+               if (current_return_type is VoidType) {
                        Report.error (stmt.source_reference, "Return with value in void function");
                        return;
                }
 
-               if (stmt.return_expression != null &&
-                    !stmt.return_expression.value_type.compatible (current_return_type)) {
+               if (stmt.return_expression.value_type == null) {
+                       stmt.error = true;
+                       Report.error (stmt.source_reference, "Invalid expression in return value");
+                       return;
+               }
+
+               if (!stmt.return_expression.value_type.compatible (current_return_type)) {
+                       stmt.error = true;
                        Report.error (stmt.source_reference, "Return: Cannot convert from `%s' to `%s'".printf (stmt.return_expression.value_type.to_string (), current_return_type.to_string ()));
                        return;
                }
 
-               if (stmt.return_expression != null &&
-                   stmt.return_expression.value_type.is_disposable () &&
+               if (stmt.return_expression.value_type.is_disposable () &&
                    !current_return_type.value_owned) {
                        stmt.error = true;
                        Report.error (stmt.source_reference, "Return value transfers ownership but method return type hasn't been declared to transfer ownership");
                        return;
                }
 
-               if (stmt.return_expression != null &&
-                   stmt.return_expression.symbol_reference is LocalVariable &&
+               if (stmt.return_expression.symbol_reference is LocalVariable &&
                    stmt.return_expression.value_type.is_disposable () &&
                    !current_return_type.value_owned) {
                        Report.warning (stmt.source_reference, "Local variable with strong reference used as return value and method return type hasn't been declared to transfer ownership");
@@ -1235,9 +1243,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                        Report.warning (stmt.source_reference, "`null' incompatible with return type `%s`".printf (current_return_type.to_string ()));
                }
 
-               if (stmt.return_expression != null) {
-                       stmt.add_error_types (stmt.return_expression.get_error_types ());
-               }
+               stmt.add_error_types (stmt.return_expression.get_error_types ());
        }
 
        public override void visit_throw_statement (ThrowStatement stmt) {