From: Luca Bruno Date: Tue, 5 Jul 2011 08:09:12 +0000 (+0200) Subject: codegen: Fix returning inline allocated arrays X-Git-Tag: 0.13.1~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b6a4aa1ae86089b1cde2fa31cd04b690879d953;p=thirdparty%2Fvala.git codegen: Fix returning inline allocated arrays Fixes bug 653908. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 39adeb4cb..1fd8eeb2c 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -3216,7 +3216,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { // return array length if appropriate if (((current_method != null && !current_method.no_array_length) || current_property_accessor != null) && current_return_type is ArrayType) { - var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt, false); + var return_expr_decl = get_temp_variable (current_return_type, true, stmt, false); ccode.add_assignment (get_variable_cexpression (return_expr_decl.name), get_cvalue (stmt.return_expression)); diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index e3f7f29bd..169de4fc9 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -317,7 +317,8 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { current_return_type.value_owned && local.variable_type.value_owned && !local.captured && - !variable_accessible_in_finally (local)) { + !variable_accessible_in_finally (local) && + !(local.variable_type is ArrayType && ((ArrayType) local.variable_type).inline_allocated)) { /* return expression is local variable taking ownership and * current method is transferring ownership */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 309c72cff..b9beaae92 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -42,6 +42,7 @@ TESTS = \ methods/bug646345.vala \ methods/bug648320.vala \ methods/bug653391.vala \ + methods/bug653908.vala \ control-flow/break.vala \ control-flow/expressions-conditional.vala \ control-flow/for.vala \ diff --git a/tests/methods/bug653908.vala b/tests/methods/bug653908.vala new file mode 100644 index 000000000..7eda5bd66 --- /dev/null +++ b/tests/methods/bug653908.vala @@ -0,0 +1,10 @@ +int[] foo() { + int bar[8]; + bar[7] = 42; + return bar; +} + +void main () { + var bar = foo (); + assert (bar[7] == 42); +}