]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: fix bounds-checking errors for CLASS array dummies [PR104908]
authorHarald Anlauf <anlauf@gmx.de>
Sat, 27 Jan 2024 16:41:43 +0000 (17:41 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Sat, 27 Jan 2024 16:41:43 +0000 (17:41 +0100)
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.

gcc/fortran/trans-array.cc
gcc/testsuite/gfortran.dg/pr104908.f90 [new file with mode: 0644]

index 878a92aff18d62f159738b2cbfc6bcf6a020cf77..1e0d698a9497b6aec54d24279ba0c3423ee45e78 100644 (file)
@@ -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;
diff --git a/gcc/testsuite/gfortran.dg/pr104908.f90 b/gcc/testsuite/gfortran.dg/pr104908.f90
new file mode 100644 (file)
index 0000000..c3a30b0
--- /dev/null
@@ -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" } }