PR fortran/95373 - ICE in build_reference_type, at tree.c:7942
authorHarald Anlauf <anlauf@gmx.de>
Thu, 28 May 2020 20:28:08 +0000 (22:28 +0200)
committerHarald Anlauf <anlauf@gmx.de>
Thu, 28 May 2020 20:32:59 +0000 (22:32 +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
check.

2020-05-28  Harald Anlauf  <anlauf@gmx.de>

gcc/fortran/
PR fortran/95373
* primary.c (is_inquiry_ref): Check validity of inquiry
references against selected Fortran standard.

gcc/testsuite/
PR fortran/95373
* gfortran.dg/pr95373_1.f90: New test.
* gfortran.dg/pr95373_2.f90: New test.

gcc/fortran/primary.c
gcc/testsuite/gfortran.dg/pr95373_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr95373_2.f90 [new file with mode: 0644]

index d73898473df68e7d2bb4aac0a133164ade79fa1a..67105cc9ab1f2d02a59a983a19b5072c71a00270 100644 (file)
@@ -1998,6 +1998,28 @@ 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 ();
diff --git a/gcc/testsuite/gfortran.dg/pr95373_1.f90 b/gcc/testsuite/gfortran.dg/pr95373_1.f90
new file mode 100644 (file)
index 0000000..f39b6a7
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-options "-std=f95" }
+! PR fortran/95373 - ICE in build_reference_type, at tree.c:7942
+
+subroutine s (x)
+  complex, parameter :: z = 3
+  real(z% kind)      :: x       ! { dg-error "nonderived-type variable" }
+  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" }
+end
diff --git a/gcc/testsuite/gfortran.dg/pr95373_2.f90 b/gcc/testsuite/gfortran.dg/pr95373_2.f90
new file mode 100644 (file)
index 0000000..2a654b4
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-options "-std=f2003" }
+! PR fortran/95373 - ICE in build_reference_type, at tree.c:7942
+
+subroutine s (x)
+  complex, parameter :: z = 3
+  real(z% kind)      :: x
+  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" }
+end