]> 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>
Wed, 15 Feb 2023 21:22:14 +0000 (22:22 +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.

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

index 96c34065691a8cc8d7dbc3510f52dbc38fbb1e8f..fb0745927acd026cf9267ab53cf01cb7a600a2e6 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