aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Kargl <kargl@gcc.gnu.org>2023-02-15 22:20:22 +0100
committerHarald Anlauf <anlauf@gmx.de>2023-02-15 22:22:14 +0100
commita418129273725fd02e881e6fb5e0877287a1356c (patch)
treeab3740d26929ddd0bc86a353474825385468408a
parenta3e499430f1cc8a8f4aea3c26d4aba2d5eaba742 (diff)
downloadgcc-a418129273725fd02e881e6fb5e0877287a1356c.zip
gcc-a418129273725fd02e881e6fb5e0877287a1356c.tar.gz
gcc-a418129273725fd02e881e6fb5e0877287a1356c.tar.bz2
Fortran: error recovery on invalid assumed size reference [PR104554]
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.
-rw-r--r--gcc/fortran/resolve.cc8
-rw-r--r--gcc/testsuite/gfortran.dg/pr104554.f9011
2 files changed, 16 insertions, 3 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 96c3406..fb07459 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -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
index 0000000..099f219
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr104554.f90
@@ -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