[Patch, Fortran, PR58586, v3] ICE with derived type with allocatable component passed by value
Mikael Morin
mikael.morin@sfr.fr
Thu May 7 10:15:00 GMT 2015
Hello,
Le 05/05/2015 11:00, Andre Vehreschild a écrit :
> diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
> index 4c18920..0b63175 100644
> --- a/gcc/fortran/trans-decl.c
> +++ b/gcc/fortran/trans-decl.c
> @@ -2158,6 +2158,8 @@ build_function_decl (gfc_symbol * sym, bool global)
> gfc_set_decl_assembler_name (fndecl, gfc_sym_mangled_function_id (sym));
>
> sym->backend_decl = fndecl;
> + if (sym == sym->result && !sym->result->backend_decl)
> + sym->result->backend_decl = result_decl;
Something is seriously misbehaving if the condition is true, and setting
sym->backend_decl to result_decl doesn't seem any better than keeping it
NULL.
So, please remove this change
> }
>
>
> @@ -5898,8 +5900,21 @@ gfc_generate_function_code (gfc_namespace * ns)
>
> if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
> {
> + bool artificial_result_decl = false;
> tree result = get_proc_result (sym);
>
> + /* Make sure that a function returning an object with
> + alloc/pointer_components always has a result, where at least
> + the allocatable/pointer components are set to zero. */
> + if (result == NULL_TREE && sym->attr.function
> + && sym->ts.type == BT_DERIVED
> + && (sym->ts.u.derived->attr.alloc_comp
> + || sym->ts.u.derived->attr.pointer_comp))
> + {
> + artificial_result_decl = true;
> + result = gfc_get_fake_result_decl (sym, 0);
> + }
I expect the "fake" result decl to be needed in more cases.
For example, if type is BT_CLASS.
Here is a variant of alloc_comp_class_4.f03:c_init for such a case.
class(c) function c_init2()
allocatable :: c_init2
end function
or even without class:
type(t) function t_init()
allocatable :: t_init
end function
for some any type t.
So, remove the check for alloc_comp/pointer_comp and permit BT_CLASS.
One minor thing, check sym->result's type and attribute instead of sym's
here. It should not make a difference, but I think it's more correct.
The rest looks good.
The patch is OK with the suggested changes above. Thanks.
I don't think the test functions above work well enough to be
incorporated in a testcase for now.
Mikael
More information about the Gcc-patches
mailing list