]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: error recovery on invalid assumed size reference [PR104554]
authorSteve Kargl <kargl@gcc.gnu.org>
Wed, 15 Feb 2023 21:20:22 +0000 (22:20 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Thu, 16 Feb 2023 17:09:39 +0000 (18:09 +0100)
gcc/fortran/ChangeLog:

PR fortran/104554
* resolve.cc (check_assumed_size_reference): Avoid NULL pointer
dereference.

gcc/testsuite/ChangeLog:

PR fortran/104554
* gfortran.dg/pr104554.f90: New test.

(cherry picked from commit a418129273725fd02e881e6fb5e0877287a1356c)

gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/pr104554.f90 [new file with mode: 0644]

index 565b212c4c8e6bd2b526b7c980d806b13a350600..532ca05b69c565d174dbeb407eb5151a8c66b41b 100644 (file)
@@ -1670,9 +1670,11 @@ check_assumed_size_reference (gfc_symbol *sym, gfc_expr *e)
 
   /* FIXME: The comparison "e->ref->u.ar.type == AR_FULL" is wrong.
      What should it be?  */
-  if (e->ref && (e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
-         && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
-              && (e->ref->u.ar.type == AR_FULL))
+  if (e->ref
+      && e->ref->u.ar.as
+      && (e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
+      && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
+      && (e->ref->u.ar.type == AR_FULL))
     {
       gfc_error ("The upper bound in the last dimension must "
                 "appear in the reference to the assumed size "
diff --git a/gcc/testsuite/gfortran.dg/pr104554.f90 b/gcc/testsuite/gfortran.dg/pr104554.f90
new file mode 100644 (file)
index 0000000..099f219
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR fortran/104554 - ICE in check_assumed_size_reference
+! Contributed by G.Steinmetz
+
+program p
+  type t
+     integer :: a
+  end type
+  class(t) :: x(*) ! { dg-error "Assumed size array" }
+  x%a = 3
+end