diff options
author | Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de> | 2004-10-07 17:12:06 +0200 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2004-10-07 17:12:06 +0200 |
commit | 5d874166a89f97e1c090c5ee661572d7c64245fc (patch) | |
tree | 574bfaa034b15098befcc64f0fa9d316cfc1f980 /gcc/fortran/primary.c | |
parent | 14de86fa0a7305603e08f42e6fa5ba4dbd2c2c7d (diff) | |
download | gcc-5d874166a89f97e1c090c5ee661572d7c64245fc.zip gcc-5d874166a89f97e1c090c5ee661572d7c64245fc.tar.gz gcc-5d874166a89f97e1c090c5ee661572d7c64245fc.tar.bz2 |
primary.c (match_boz_constant): Allow kind parameter suffixes.
fortran/
* primary.c (match_boz_constant): Allow kind parameter suffixes.
Move standard warning further to the front.
testsuite/
* gfortran.fortran-torture/execute/intrinsic_mvbits.f90,
gfortran.dg/ishft.f90: Add more tests.
From-SVN: r88690
Diffstat (limited to 'gcc/fortran/primary.c')
-rw-r--r-- | gcc/fortran/primary.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index 45348e6..fe6645d 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -235,7 +235,7 @@ match_integer_constant (gfc_expr ** result, int signflag) static match match_boz_constant (gfc_expr ** result) { - int radix, delim, length, x_hex; + int radix, delim, length, x_hex, kind; locus old_loc; char *buffer; gfc_expr *e; @@ -272,6 +272,12 @@ match_boz_constant (gfc_expr ** result) if (delim != '\'' && delim != '\"') goto backup; + if (x_hex && pedantic + && (gfc_notify_std (GFC_STD_GNU, "Extension: Hexadecimal " + "constant at %C uses non-standard syntax.") + == FAILURE)) + return MATCH_ERROR; + old_loc = gfc_current_locus; length = match_digits (0, radix, NULL); @@ -293,25 +299,25 @@ match_boz_constant (gfc_expr ** result) memset (buffer, '\0', length + 1); match_digits (0, radix, buffer); - gfc_next_char (); + 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; - e = gfc_convert_integer (buffer, gfc_default_integer_kind, radix, - &gfc_current_locus); + e = gfc_convert_integer (buffer, kind, radix, &gfc_current_locus); if (gfc_range_check (e) != ARITH_OK) { - gfc_error ("Integer too big for default integer kind at %C"); - - gfc_free_expr (e); - return MATCH_ERROR; - } + gfc_error ("Integer too big for integer kind %i at %C", kind); - if (x_hex - && pedantic - && (gfc_notify_std (GFC_STD_GNU, "Extension: Hexadecimal " - "constant at %C uses non-standard syntax.") - == FAILURE)) - { gfc_free_expr (e); return MATCH_ERROR; } |