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