[gcc(refs/vendors/ARM/heads/arm-perf-staging)] PR fortran/95373 - ICE in build_reference_type, at tree.c:7942

Tamar Christina tnfchris@gcc.gnu.org
Fri Jul 17 15:22:36 GMT 2020


https://gcc.gnu.org/g:2927ec5bc1276188efae82301d8fcffe4a245d1e

commit 2927ec5bc1276188efae82301d8fcffe4a245d1e
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Sat May 30 20:59:41 2020 +0200

    PR fortran/95373 - ICE in build_reference_type, at tree.c:7942
    
    The use of KIND, LEN, RE, and IM inquiry references for applicable intrinsic
    types is valid only for suffienctly new Fortran standards.  Add appropriate
    checks in the appropriate place.
    
    2020-05-30  Harald Anlauf  <anlauf@gmx.de>
    
    gcc/fortran/
            PR fortran/95373
            * primary.c (is_inquiry_ref): Move validity check of inquiry
            references against selected Fortran standard from here...
            (gfc_match_varspec) ...to here.
    
    gcc/testsuite/
            PR fortran/95373
            * gfortran.dg/pr95373_1.f90: Adjust error messages.
            * gfortran.dg/pr95373_2.f90: Adjust error message.
    
    (cherry picked from commit dd38c765a04d06c775134a135f68b18c3b7c9c78)

Diff:
---
 gcc/fortran/primary.c                   | 43 ++++++++++++++++-----------------
 gcc/testsuite/gfortran.dg/pr95373_1.f90 |  4 +--
 gcc/testsuite/gfortran.dg/pr95373_2.f90 |  2 +-
 3 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 67105cc9ab1..7c221c8d209 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1998,28 +1998,6 @@ is_inquiry_ref (const char *name, gfc_ref **ref)
   else
     return false;
 
-  switch (type)
-    {
-    case INQUIRY_RE:
-    case INQUIRY_IM:
-      if (!gfc_notify_std (GFC_STD_F2008, "RE or IM part_ref at %C"))
-	return false;
-      break;
-
-    case INQUIRY_KIND:
-      if (!gfc_notify_std (GFC_STD_F2003, "KIND part_ref at %C"))
-	return false;
-      break;
-
-    case INQUIRY_LEN:
-      if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
-	return false;
-      break;
-
-    default:
-      gcc_unreachable ();
-    }
-
   if (ref)
     {
       *ref = gfc_get_ref ();
@@ -2267,6 +2245,27 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
 	    {
 	      if (tmp)
 		{
+		  switch (tmp->u.i)
+		    {
+		    case INQUIRY_RE:
+		    case INQUIRY_IM:
+		      if (!gfc_notify_std (GFC_STD_F2008,
+					   "RE or IM part_ref at %C"))
+			return MATCH_ERROR;
+		      break;
+
+		    case INQUIRY_KIND:
+		      if (!gfc_notify_std (GFC_STD_F2003,
+					   "KIND part_ref at %C"))
+			return MATCH_ERROR;
+		      break;
+
+		    case INQUIRY_LEN:
+		      if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
+			return MATCH_ERROR;
+		      break;
+		    }
+
 		  if ((tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
 		      && primary->ts.type != BT_COMPLEX)
 		    {
diff --git a/gcc/testsuite/gfortran.dg/pr95373_1.f90 b/gcc/testsuite/gfortran.dg/pr95373_1.f90
index f39b6a72346..59a9e7a81e0 100644
--- a/gcc/testsuite/gfortran.dg/pr95373_1.f90
+++ b/gcc/testsuite/gfortran.dg/pr95373_1.f90
@@ -4,12 +4,12 @@
 
 subroutine s (x)
   complex, parameter :: z = 3
-  real(z% kind)      :: x       ! { dg-error "nonderived-type variable" }
+  real(z% kind)      :: x       ! { dg-error "Fortran 2003: KIND part_ref" }
   type t
      real    :: kind
      logical :: re
   end type t
   type(t) :: b
   print *, b% kind, b% re
-  print *, z% re                ! { dg-error "nonderived-type variable" }
+  print *, z% re                ! { dg-error "Fortran 2008: RE or IM part_ref" }
 end
diff --git a/gcc/testsuite/gfortran.dg/pr95373_2.f90 b/gcc/testsuite/gfortran.dg/pr95373_2.f90
index 2a654b43faa..b0f3da0a20d 100644
--- a/gcc/testsuite/gfortran.dg/pr95373_2.f90
+++ b/gcc/testsuite/gfortran.dg/pr95373_2.f90
@@ -11,5 +11,5 @@ subroutine s (x)
   end type t
   type(t) :: b
   print *, b% kind, b% re
-  print *, z% re                ! { dg-error "nonderived-type variable" }
+  print *, z% re                ! { dg-error "Fortran 2008: RE or IM part_ref" }
 end


More information about the Gcc-cvs mailing list