From: Tobias Burnus Date: Mon, 25 Nov 2019 14:33:32 +0000 (+0100) Subject: Fortran] PR 92050 - fix ICE with -fcheck=all X-Git-Tag: releases/gcc-9.3.0~356 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f87738fca613800f068ea09888144a588a31146d;p=thirdparty%2Fgcc.git Fortran] PR 92050 - fix ICE with -fcheck=all Backport from mainline 2019-10-11 Tobias Burnus PR fortran/92050 * trans-expr.c (gfc_conv_procedure_call): Handle code generated by -fcheck=all. PR fortran/92050 * gfortran.dg/pr92050.f90: New. From-SVN: r278689 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 42430e46ef69..181a48c574e3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2019-11-25 Tobias Burnus + + PR fortran/92050 + * trans-expr.c (gfc_conv_procedure_call): Handle code generated + by -fcheck=all. + 2019-11-10 Thomas Koenig Backport from trunk diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 52a8cdd6902e..fe10d52dd164 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -6818,8 +6818,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/ChangeLog b/gcc/testsuite/ChangeLog index c9e38713caaa..40c60b99e907 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-11-25 Tobias Burnus + + PR fortran/92050 + * gfortran.dg/pr92050.f90: New. + 2019-11-25 Eric Botcazou * gnat.dg/addr14.adb: New test. diff --git a/gcc/testsuite/gfortran.dg/pr92050.f90 b/gcc/testsuite/gfortran.dg/pr92050.f90 new file mode 100644 index 000000000000..64193878d8fd --- /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" }