public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-11231] Fortran: fix bounds-checking errors for CLASS array dummies [PR104908]
@ 2024-02-09 20:28 Harald Anlauf
  0 siblings, 0 replies; only message in thread
From: Harald Anlauf @ 2024-02-09 20:28 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:07b575d5860dbc8791dbb9d10af9f918f34d7ff0

commit r11-11231-g07b575d5860dbc8791dbb9d10af9f918f34d7ff0
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Sat Jan 27 17:41:43 2024 +0100

    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.c (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.
    
    (cherry picked from commit ce61de1b8a1bb3a22118e900376f380768f2ba59)

Diff:
---
 gcc/fortran/trans-array.c              |  5 ++++-
 gcc/testsuite/gfortran.dg/pr104908.f90 | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index abdecc7df7a9..44f6ad7c8a00 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -3723,7 +3723,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
index 000000000000..c3a30b0003c5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr104908.f90
@@ -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" } }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-09 20:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-09 20:28 [gcc r11-11231] Fortran: fix bounds-checking errors for CLASS array dummies [PR104908] Harald Anlauf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).