[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