Skip to content

Commit

Permalink
Fortran: fix bounds-checking errors for CLASS array dummies [PR104908]
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
harald-anlauf authored and ouuleilei-bot committed Jan 27, 2024
1 parent c2d62cd commit 3f191ac
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
5 changes: 4 additions & 1 deletion gcc/fortran/trans-array.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3962,7 +3962,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;
Expand Down
32 changes: 32 additions & 0 deletions gcc/testsuite/gfortran.dg/pr104908.f90
Original file line number Diff line number Diff line change
@@ -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" } }

0 comments on commit 3f191ac

Please sign in to comment.