This is a follow up to PR95586 which fixed only the ICE that occurred when using derived types in an implicit statement.  The ICE occurred because an attempt was made to determine kind for types that do not have kinds.

This patch ensures that kind is only determined for types that support kind.

OK for master?

Is it worth backporting?

[PATCH] Fortran  : ICE in gfc_validate_kind PR96099

Only check for kind if the type supports kind.

2020-10-02  Mark Eggleston <markeggles...@gcc.gnu.org>

/gcc/fortran

    PR fortran/96099
    * decl.c (gfc_match_implicit): Check for numeric and logical
    types.

2020-10-02  Mark Eggleston <markeggles...@gcc.gnu.org>

/gcc/testsuite

    PR fortran/96099
    * gfortran.dg/pr96099_1.f90: New test.
    * gfortran.dg/pr96099_2.f90: New test.

--
https://www.codethink.co.uk/privacy.html

>From 8770d2c3f599f8e758747b606613ae53f0b26bc9 Mon Sep 17 00:00:00 2001
From: Mark Eggleston <markeggles...@gcc.gnu.org>
Date: Thu, 1 Oct 2020 11:14:09 +0100
Subject: [PATCH] Fortran  : ICE in gfc_validate_kind PR96099

Only check for kind if the type supports kind.

2020-10-02  Mark Eggleston  <markeggles...@gcc.gnu.org>

/gcc/fortran

	PR fortran/96099
	* decl.c (gfc_match_implicit): Check for numeric and logical
	types.

2020-10-02  Mark Eggleston  <markeggles...@gcc.gnu.org>

/gcc/testsuite

	PR fortran/96099
	* gfortran.dg/pr96099_1.f90: New test.
	* gfortran.dg/pr96099_2.f90: New test.
---
 gcc/fortran/decl.c                      | 2 +-
 gcc/testsuite/gfortran.dg/pr96099_1.f90 | 8 ++++++++
 gcc/testsuite/gfortran.dg/pr96099_2.f90 | 9 +++++++++
 3 files changed, 18 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/pr96099_1.f90
 create mode 100644 gcc/testsuite/gfortran.dg/pr96099_2.f90

diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 326e6f5db7a..bddf69cce19 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -4835,7 +4835,7 @@ gfc_match_implicit (void)
       /* Last chance -- check <TYPE> <SELECTOR> (<RANGE>).  */
       if (ts.type == BT_CHARACTER)
 	m = gfc_match_char_spec (&ts);
-      else if (ts.type != BT_DERIVED)
+      else if (gfc_numeric_ts(&ts) || ts.type == BT_LOGICAL)
 	{
 	  m = gfc_match_kind_spec (&ts, false);
 	  if (m == MATCH_NO)
diff --git a/gcc/testsuite/gfortran.dg/pr96099_1.f90 b/gcc/testsuite/gfortran.dg/pr96099_1.f90
new file mode 100644
index 00000000000..9754bd39dfc
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96099_1.f90
@@ -0,0 +1,8 @@
+! { dg-do compile }
+
+program pr96099_1
+   implicit class(t) (1) ! { dg-error "Syntax error in IMPLICIT" }
+   type t
+   end type
+end
+
diff --git a/gcc/testsuite/gfortran.dg/pr96099_2.f90 b/gcc/testsuite/gfortran.dg/pr96099_2.f90
new file mode 100644
index 00000000000..3136d2ef377
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96099_2.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+
+program pr96099_2
+   integer n1
+   parameter (n1 = 1)
+   implicit class(t) (n1) ! { dg-error "Syntax error in IMPLICIT" }
+   type t
+   end type
+end
-- 
2.11.0

Reply via email to