Found as part of PR 47455. For the following program function find_y() result(res) type(tx), allocatable :: res ! do something sensible such as "allocate(res)" end function find_y the dump looks as follows find_y () { struct tx * res; res.i.data = 0B; /* <<<< WRONG. */ res = 0B; /* some code. */ return res; } If one does not use a RESULT variable but "find_y" as result variable, the dump looks as follows: find_y () { __result_find_y.i.data = 0B; /* Note: 1. */ return __result_find_y; } Note 1: Unless "find_y" is used (e.g. "allocate(find_y)") the function is generated with an empty body. For some reason, the example program below does not crash here with gfortran 4.5/4.6, but the dump is wrong and I am sure it can cause problems in certain cases. The example of bug 47455 comment 4 does crash - and I believe(d) that it is due to this bug. program test type :: tx integer, dimension(:), allocatable :: i end type tx type(tx) :: x x = find_y() if (allocated(x%i)) call abort() contains function find_y() result(res) type(tx), allocatable :: res allocate(res) end function find_y end program test
Patch. The order was wrong; additionally, if there is an allocatable RESULT variable, it seems to get zero initialized via sym->value or similarly. Thus the sym->result == result check prevents that two "res = 0B;" lines get added. --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -4602,16 +4716,18 @@ gfc_generate_function_code (gfc_namespace * ns) && sym->attr.function && !sym->attr.pointer) { - if (sym->ts.type == BT_DERIVED - && sym->ts.u.derived->attr.alloc_comp) + if (sym->attr.allocatable && sym->attr.dimension == 0 + && sym->result == sym) + gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result), + null_pointer_node)); + else if (sym->ts.type == BT_DERIVED + && sym->ts.u.derived->attr.alloc_comp + && !sym->attr.allocatable) { rank = sym->as ? sym->as->rank : 0; tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, result, rank); gfc_add_expr_to_block (&init, tmp); } - else if (sym->attr.allocatable && sym->attr.dimension == 0) - gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result), - null_pointer_node)); } if (result == NULL_TREE)
Submitted patch: http://gcc.gnu.org/ml/fortran/2011-01/msg00235.html
Author: burnus Date: Thu Jan 27 22:47:08 2011 New Revision: 169340 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=169340 Log: 2011-01-27 Tobias Burnus <burnus@net-b.de> PR fortran/47474 * trans-decl.c (gfc_generate_function_code): Fix init of allocatable result variable with allocatable components. Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/trans-decl.c
FIXED on the trunk (4.6)
Author: dnovillo Date: Wed Feb 2 17:58:18 2011 New Revision: 169657 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=169657 Log: 2011-01-27 Tobias Burnus <burnus@net-b.de> PR fortran/47474 * trans-decl.c (gfc_generate_function_code): Fix init of allocatable result variable with allocatable components. Modified: branches/google/integration/gcc/fortran/ChangeLog branches/google/integration/gcc/fortran/trans-decl.c