Fortran] PR 92050 - fix ICE with -fcheck=all
gcc/fortran/ PR fortran/92050 * trans-expr.c (gfc_conv_procedure_call): Handle code generated by -fcheck=all. gcc/testsuite/ PR fortran/92050 * gfortran.dg/pr92050.f90: New. From-SVN: r276885
This commit is contained in:
parent
1284e2b104
commit
643d443665
4 changed files with 69 additions and 2 deletions
|
@ -1,3 +1,9 @@
|
|||
2019-10-11 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
PR fortran/92050
|
||||
* trans-expr.c (gfc_conv_procedure_call): Handle code generated
|
||||
by -fcheck=all.
|
||||
|
||||
2019-10-11 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
* f95-lang.c (LANG_HOOKS_OMP_IS_ALLOCATABLE_OR_PTR): Re-define to
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2019-10-11 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
PR fortran/92050
|
||||
* gfortran.dg/pr92050.f90: New.
|
||||
|
||||
2019-10-11 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/90883
|
||||
|
|
53
gcc/testsuite/gfortran.dg/pr92050.f90
Normal file
53
gcc/testsuite/gfortran.dg/pr92050.f90
Normal file
|
@ -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" }
|
Loading…
Add table
Reference in a new issue