PR fortran/95373 - ICE in build_reference_type, at tree.c:7942
authorHarald Anlauf <anlauf@gmx.de>
Sat, 30 May 2020 18:59:41 +0000 (20:59 +0200)
committerHarald Anlauf <anlauf@gmx.de>
Sat, 30 May 2020 18:59:41 +0000 (20:59 +0200)
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.

gcc/fortran/primary.c
gcc/testsuite/gfortran.dg/pr95373_1.f90
gcc/testsuite/gfortran.dg/pr95373_2.f90

index 67105cc9ab1f2d02a59a983a19b5072c71a00270..7c221c8d209727bcdfb832dfd0bbc11e90c6a448 100644 (file)
@@ -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)
                    {
index f39b6a723467c6475710c7ad02936901469f4b0a..59a9e7a81e08e206e6367a87fc6485cd9c3153c2 100644 (file)
@@ -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
index 2a654b43faad125fc59ca9980a86b806c4a66d3d..b0f3da0a20d7f7645a9a5499be18b6d133fa42eb 100644 (file)
@@ -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