[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-fortran
Subject:    Re: [patch,Fortran] PR 92050 - fix ICE with -fcheck=all
From:       Tobias Burnus <tobias () codesourcery ! com>
Date:       2019-11-22 12:36:03
Message-ID: b3227d9a-8ea7-2a75-41a8-3195cfab5f95 () codesourcery ! com
[Download RAW message or body]

Hi all,

I was asked to backport this fix to the GCC 9 branch – given that 
-fcheck=bounds is a common option and it fails with code like 
genecode.org. Given that ICEs with -fcheck are a regression and that the 
patch is not that invasive, I am inclined to accept it.

Comments/(dis)approvals?

Tobias

On 10/11/19 12:17 PM, Tobias Burnus wrote:
> Checking produces extra code (unsurprisingly); this code needs to end 
> up in the program…
> 
> Bootstrapped on x86-64_gnu-linux. OK for the trunk?
> 
> Tobias
> 
> 
> pr92050.diff
> 
> diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
> index 965ab7786a1..65238ff623d 100644
> --- a/gcc/fortran/trans-expr.c
> +++ b/gcc/fortran/trans-expr.c
> @@ -7031,8 +7031,11 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
> 	gfc_allocate_lang_decl (result);
> GFC_DECL_SAVED_DESCRIPTOR (result) = parmse.expr;
> gfc_free_expr (class_expr);
> -      gcc_assert (parmse.pre.head == NULL_TREE
> -		  && parmse.post.head == NULL_TREE);
> +      /* -fcheck= can add diagnostic code, which has to be placed before
> +	 the call. */
> +      if (parmse.pre.head != NULL)
> +	  gfc_add_expr_to_block (&se->pre, parmse.pre.head);
> +      gcc_assert (parmse.post.head == NULL_TREE);
> }
> 
> /* Follow the function call with the argument post block.  */
> diff --git a/gcc/testsuite/gfortran.dg/pr92050.f90 \
> b/gcc/testsuite/gfortran.dg/pr92050.f90 new file mode 100644
> index 00000000000..64193878d8f
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/pr92050.f90
> @@ -0,0 +1,53 @@
> +! { dg-do run }
> +! { dg-options "-fcheck=all" }
> +! { dg-shouldfail "above upper bound" }
> +!
> +! PR fortran/92050
> +!
> +!
> +module buggy
> +  implicit none (type, external)
> +
> +  type :: par
> +  contains
> +    procedure, public :: fun => fun_par
> +  end type par
> +
> +  type comp
> +    class(par), allocatable :: p
> +  end type comp
> +
> +  type foo
> +    type(comp), allocatable :: m(:)
> +  end type foo
> +
> +contains
> +
> +  function fun_par(this)
> +    class(par) :: this
> +    integer    :: fun_par(1)
> +    fun_par = 42
> +  end function fun_par
> +
> +  subroutine update_foo(this)
> +    class(foo) :: this
> +    write(*,*) this%m(1)%p%fun()
> +  end subroutine update_foo
> +
> +  subroutine bad_update_foo(this)
> +    class(foo) :: this
> +    write(*,*) this%m(2)%p%fun()
> +  end subroutine bad_update_foo
> +end module buggy
> +
> +program main
> +  use buggy
> +  implicit none (type, external)
> +  type(foo) :: x
> +  allocate(x%m(1))
> +  allocate(x%m(1)%p)
> +  call update_foo(x)
> +  call bad_update_foo(x)
> +end program main
> +
> +! { dg-output "At line 39 of file .*pr92050.f90.*Fortran runtime error: Index '2' \
> of dimension 1 of array 'this%m' above upper bound of 1" }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic