From f4e7375a8a167e98de05f2f0b34a8fd6f57e0a96 Mon Sep 17 00:00:00 2001
From: "Steven G. Kargl" <kargl@gcc.gnu.org>
Date: Mon, 28 Feb 2005 00:38:12 +0000
Subject: [PATCH] re PR fortran/20058 (Error on kind 16 hex data statement)

PR fortran/20058
* trans-types.c (gfc_max_integer_kind): Declare
  (gfc_init_kinds): Initialize it.
* gfortran.h (gfc_max_integer_kind): extern it.
* primary.c (match_boz_constant): Use it; remove gfortran extension
  of kind suffixes on BOZ literal constants

From-SVN: r95643
---
 gcc/fortran/ChangeLog     | 10 ++++++++++
 gcc/fortran/gfortran.h    |  1 +
 gcc/fortran/primary.c     | 18 ++++++++----------
 gcc/fortran/trans-types.c |  4 ++++
 4 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f5c23a3903f8..47211b86d20d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,13 @@
+2005-02-27  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+	PR fortran/20058
+	* trans-types.c (gfc_max_integer_kind): Declare
+	(gfc_init_kinds): Initialize it.
+	* gfortran.h (gfc_max_integer_kind): extern it.
+	* primary.c (match_boz_constant): Use it; remove gfortran extension
+	of kind suffixes on BOZ literal constants
+
+
 2005-02-27  Steven G. Kargl  <kargls@comcast.net>
 
 	* arith.c (gfc_check_real_range):  Remove multiple returns
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index adbccc11486a..58efec944fb6 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1556,6 +1556,7 @@ void gfc_arith_done_1 (void);
 int gfc_validate_kind (bt, int, bool);
 extern int gfc_index_integer_kind;
 extern int gfc_default_integer_kind;
+extern int gfc_max_integer_kind;
 extern int gfc_default_real_kind;
 extern int gfc_default_double_kind;
 extern int gfc_default_character_kind;
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index f3c51ab46759..b87d72a1830a 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -300,17 +300,15 @@ match_boz_constant (gfc_expr ** result)
   match_digits (0, radix, buffer);
   gfc_next_char ();  /* Eat delimiter.  */
 
-  kind = get_kind ();
-  if (kind == -1)
-    return MATCH_ERROR;
-  if (kind == -2)
-    kind = gfc_default_integer_kind;
-  else if (pedantic 
-	   && (gfc_notify_std (GFC_STD_GNU, "Extension: Kind parameter "
-			       "suffix to boz literal constant at %C.")
-	       == FAILURE))
-    return MATCH_ERROR;
 
+  /* In section 5.2.5 and following C567 in the Fortran 2003 standard, we find
+     "If a data-stmt-constant is a boz-literal-constant, the corresponding
+     variable shall be of type integer.  The boz-literal-constant is treated
+     as if it were an int-literal-constant with a kind-param that specifies
+     the representation method with the largest decimal exponent range
+     supported by the processor."  */
+
+  kind = gfc_max_integer_kind;
   e = gfc_convert_integer (buffer, kind, radix, &gfc_current_locus);
 
   if (gfc_range_check (e) != ARITH_OK)
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 7bd0011ce8a2..3ac068c0f115 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -81,6 +81,7 @@ int gfc_index_integer_kind;
 /* The default kinds of the various types.  */
 
 int gfc_default_integer_kind;
+int gfc_max_integer_kind;
 int gfc_default_real_kind;
 int gfc_default_double_kind;
 int gfc_default_character_kind;
@@ -135,6 +136,9 @@ gfc_init_kinds (void)
       i_index += 1;
     }
 
+  /* Set the maximum integer kind.  Used with at least BOZ constants.  */
+  gfc_max_integer_kind = gfc_integer_kinds[i_index - 1].kind;
+
   for (r_index = 0, mode = MIN_MODE_FLOAT; mode <= MAX_MODE_FLOAT; mode++)
     {
       const struct real_format *fmt = REAL_MODE_FORMAT (mode);
-- 
GitLab