Fortran: error recovery on associate with bad selector [PR107577]
authorSteve Kargl <kargl@gcc.gnu.org>
Tue, 22 Nov 2022 21:31:51 +0000 (22:31 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Wed, 23 Nov 2022 18:10:42 +0000 (19:10 +0100)
gcc/fortran/ChangeLog:

PR fortran/107577
* resolve.cc (find_array_spec): Choose appropriate locus either of
bad array reference or of non-array entity in error message.

gcc/testsuite/ChangeLog:

PR fortran/107577
* gfortran.dg/pr107577.f90: New test.

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

index 24e5aa0..3396c6c 100644 (file)
@@ -5005,8 +5005,9 @@ find_array_spec (gfc_expr *e)
       case REF_ARRAY:
        if (as == NULL)
          {
+           locus loc = ref->u.ar.where.lb ? ref->u.ar.where : e->where;
            gfc_error ("Invalid array reference of a non-array entity at %L",
-                      &ref->u.ar.where);
+                      &loc);
            return false;
          }
 
diff --git a/gcc/testsuite/gfortran.dg/pr107577.f90 b/gcc/testsuite/gfortran.dg/pr107577.f90
new file mode 100644 (file)
index 0000000..94e6620
--- /dev/null
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! PR fortran/107577 - ICE in find_array_spec
+! Contributed by G.Steinmetz
+
+program p
+  implicit none
+  associate (y => f(4))            ! { dg-error "has no IMPLICIT type" }
+    if (lbound (y, 1) /= 1) stop 1 ! { dg-error "Invalid array reference" }
+    if (y(1) /= 1) stop 2          ! { dg-error "Invalid array reference" }
+  end associate
+end
+
+! { dg-error "has no type" " " { target *-*-* } 7 }