[PATCH] Fix Fortran ICE in tree-nested.c (PR fortran/92781)

Tobias Burnus tobias@codesourcery.com
Thu Dec 5 08:13:00 GMT 2019


On 12/5/19 9:10 AM, Jakub Jelinek wrote:
> In the following testcase, sym is the current function, we have created
> earlier .__result as the PARM_DECL containing pointer to the length to be
> returned and ..__result is a local VAR_DECL which contains the string length
> inside of the function and is at the end copied to *.__result.
>
> The reason this ICEs in tree-nested.c is that DECL_CONTEXT of that automatic
> ..__result variable is NULL, rather than the expected context of the current
> function.  This happens because we attempt to add it to the parent function
> (which there isn't any), so DECL_CONTEXT is NULL.
>
> The following patch fixes that, bootstrapped/regtested on x86_64-linux and
> i686-linux, ok for trunk?

LGTM – thanks for the patch!

Tobias

> 2019-12-05  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR fortran/92781
> 	* trans-decl.c (gfc_get_symbol_decl): If sym->backend_decl is
> 	current_function_decl, add length to current rather than parent
> 	function and expect DECL_CONTEXT (length) to be current_function_decl.
>
> 	* gfortran.dg/pr92781.f90: New test.
>
> --- gcc/fortran/trans-decl.c.jj	2019-11-11 21:04:05.000000000 +0100
> +++ gcc/fortran/trans-decl.c	2019-12-04 12:32:58.489578829 +0100
> @@ -1631,15 +1631,18 @@ gfc_get_symbol_decl (gfc_symbol * sym)
>   	      /* Add the string length to the same context as the symbol.  */
>   	      if (DECL_CONTEXT (length) == NULL_TREE)
>   		{
> -		  if (DECL_CONTEXT (sym->backend_decl)
> -		      == current_function_decl)
> +		  if (sym->backend_decl == current_function_decl
> +		      || (DECL_CONTEXT (sym->backend_decl)
> +			  == current_function_decl))
>   		    gfc_add_decl_to_function (length);
>   		  else
>   		    gfc_add_decl_to_parent_function (length);
>   		}
>   
> -	      gcc_assert (DECL_CONTEXT (sym->backend_decl)
> -			  == DECL_CONTEXT (length));
> +	      gcc_assert (sym->backend_decl == current_function_decl
> +			  ? DECL_CONTEXT (length) == current_function_decl
> +			  : (DECL_CONTEXT (sym->backend_decl)
> +			     == DECL_CONTEXT (length)));
>   
>   	      gfc_defer_symbol_init (sym);
>   	    }
> --- gcc/testsuite/gfortran.dg/pr92781.f90.jj	2019-12-04 12:42:39.063598013 +0100
> +++ gcc/testsuite/gfortran.dg/pr92781.f90	2019-12-04 12:42:20.032891766 +0100
> @@ -0,0 +1,11 @@
> +! PR fortran/92781
> +! { dg-do compile }
> +
> +function foo ()
> +  character(:), allocatable :: foo
> +  call bar ()
> +  foo = 'abc'
> +contains
> +  subroutine bar
> +  end
> +end
>
> 	Jakub
>



More information about the Fortran mailing list