From: Jürg Billeter Date: Fri, 16 Jan 2009 20:50:07 +0000 (+0000) Subject: Report error when returning owned variable in method or property with X-Git-Tag: VALA_0_5_6~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08b91dcc52204ce252abd8241946c752c4bd84b1;p=thirdparty%2Fvala.git Report error when returning owned variable in method or property with 2009-01-16 Jürg Billeter * vala/valaexpression.vala: * vala/valareturnstatement.vala: Report error when returning owned variable in method or property with unowned return value, fixes bug 547102 svn path=/trunk/; revision=2365 --- diff --git a/ChangeLog b/ChangeLog index 0f3298aad..eaaae32d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-01-16 Jürg Billeter + + * vala/valaexpression.vala: + * vala/valareturnstatement.vala: + + Report error when returning owned variable in method or property + with unowned return value, fixes bug 547102 + 2009-01-16 Jürg Billeter * vapi/packages/gconf-2.0/: diff --git a/vala/valaexpression.vala b/vala/valaexpression.vala index 95fd844a3..8f37efd7a 100644 --- a/vala/valaexpression.vala +++ b/vala/valaexpression.vala @@ -1,6 +1,6 @@ /* valaexpression.vala * - * Copyright (C) 2006-2008 Jürg Billeter + * Copyright (C) 2006-2009 Jürg Billeter * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -91,7 +91,7 @@ public abstract class Vala.Expression : CodeNode { var stmt = parent_node as Statement; var local = parent_node as LocalVariable; if (stmt != null) { - return stmt; + return (Statement) parent_node; } else if (expr != null) { return expr.parent_statement; } else if (local != null) { diff --git a/vala/valareturnstatement.vala b/vala/valareturnstatement.vala index 2f6a2bd88..79e2fbaae 100644 --- a/vala/valareturnstatement.vala +++ b/vala/valareturnstatement.vala @@ -126,10 +126,12 @@ public class Vala.ReturnStatement : CodeNode, Statement { return false; } - if (return_expression.symbol_reference is LocalVariable && - return_expression.value_type.is_disposable () && + var local = return_expression.symbol_reference as LocalVariable; + if (local != null && local.variable_type.is_disposable () && !analyzer.current_return_type.value_owned) { - Report.warning (source_reference, "Local variable with strong reference used as return value and method return type hasn't been declared to transfer ownership"); + error = true; + Report.error (source_reference, "Local variable with strong reference used as return value and method return type has not been declared to transfer ownership"); + return false; } if (return_expression is NullLiteral