From: Jürg Billeter Date: Sat, 25 Oct 2008 14:54:29 +0000 (+0000) Subject: Fix crash with invalid return values, fixes bug 549996 X-Git-Tag: VALA_0_5_1~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aee8e47f04bbcd63d13b42f516e14f0ee10381dc;p=thirdparty%2Fvala.git Fix crash with invalid return values, fixes bug 549996 2008-10-25 Jürg Billeter * vala/valasemanticanalyzer.vala: Fix crash with invalid return values, fixes bug 549996 svn path=/trunk/; revision=1920 --- diff --git a/ChangeLog b/ChangeLog index 30aa7c5ec..0d07ece15 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-10-25 Jürg Billeter + + * vala/valasemanticanalyzer.vala: + + Fix crash with invalid return values, fixes bug 549996 + 2008-10-25 Jürg Billeter * vala/valaerrorcode.vala: diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index ff3fbcaf3..8ad930dca 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -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) {