Fortran: fix bounds-checking errors for CLASS array dummies [PR104908]
Commit r11-1235 addressed issues with bounds of unlimited polymorphic array dummies. However, using the descriptor from sym->backend_decl does break the case of CLASS array dummies. The obvious solution is to restrict the fix to the unlimited polymorphic case, thus keeping the original descriptor in the ordinary case. gcc/fortran/ChangeLog: PR fortran/104908 * trans-array.cc (gfc_conv_array_ref): Restrict use of transformed descriptor (sym->backend_decl) to the unlimited polymorphic case. gcc/testsuite/ChangeLog: PR fortran/104908 * gfortran.dg/pr104908.f90: New test.
This commit is contained in:
parent
7cc9adc62c
commit
ce61de1b8a
2 changed files with 36 additions and 1 deletions
|
@ -4063,7 +4063,10 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_expr *expr,
|
|||
}
|
||||
|
||||
decl = se->expr;
|
||||
if (IS_CLASS_ARRAY (sym) && sym->attr.dummy && ar->as->type != AS_DEFERRED)
|
||||
if (UNLIMITED_POLY(sym)
|
||||
&& IS_CLASS_ARRAY (sym)
|
||||
&& sym->attr.dummy
|
||||
&& ar->as->type != AS_DEFERRED)
|
||||
decl = sym->backend_decl;
|
||||
|
||||
cst_offset = offset = gfc_index_zero_node;
|
||||
|
|
32
gcc/testsuite/gfortran.dg/pr104908.f90
Normal file
32
gcc/testsuite/gfortran.dg/pr104908.f90
Normal file
|
@ -0,0 +1,32 @@
|
|||
! { dg-do compile }
|
||||
! { dg-additional-options "-fcheck=bounds -fdump-tree-original" }
|
||||
!
|
||||
! PR fortran/104908 - incorrect out-of-bounds runtime error
|
||||
|
||||
program test
|
||||
implicit none
|
||||
type vec
|
||||
integer :: x(3) = [2,4,6]
|
||||
end type vec
|
||||
type(vec) :: w(2)
|
||||
call sub(w)
|
||||
contains
|
||||
subroutine sub (v)
|
||||
class(vec), intent(in) :: v(:)
|
||||
integer :: k, q(3)
|
||||
q = [ (v(1)%x(k), k = 1, 3) ] ! <-- was failing here after r11-1235
|
||||
print *, q
|
||||
end
|
||||
end
|
||||
|
||||
subroutine sub2 (zz)
|
||||
implicit none
|
||||
type vec
|
||||
integer :: x(2,1)
|
||||
end type vec
|
||||
class(vec), intent(in) :: zz(:) ! used to ICE after r11-1235
|
||||
integer :: k
|
||||
k = zz(1)%x(2,1)
|
||||
end
|
||||
|
||||
! { dg-final { scan-tree-dump-times " above upper bound " 4 "original" } }
|
Loading…
Add table
Reference in a new issue