diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2009-08-24 03:41:56 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2009-08-24 03:41:56 +0000 |
commit | de1ee8e1ee11c40f11200b91dad82c0bd958f6fe (patch) | |
tree | b53bece69770488a18ee0cea71bf15d73271bed2 /gcc/fortran | |
parent | 287043384564993d081a309b6aacfa5783dd3dda (diff) | |
download | gcc-de1ee8e1ee11c40f11200b91dad82c0bd958f6fe.zip gcc-de1ee8e1ee11c40f11200b91dad82c0bd958f6fe.tar.gz gcc-de1ee8e1ee11c40f11200b91dad82c0bd958f6fe.tar.bz2 |
re PR fortran/37446 (Diagnostic of edit descriptors, esp. EN)
2009-08-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/37446
* io.c (enum format_token): Change FMT_EXT to FMT_EN and FMT_ES.
(format_lex): Likewise.
(token_to_string): New function.
(check_format): Use the new tokens and the new function. Add
check for positive width.
From-SVN: r151043
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/io.c | 63 |
2 files changed, 60 insertions, 12 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index dc51f02..1ac3066 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2009-08-23 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/37446 + * io.c (enum format_token): Change FMT_EXT to FMT_EN and FMT_ES. + (format_lex): Likewise. + (token_to_string): New function. + (check_format): Use the new tokens and the new function. Add + check for positive width. + 2009-08-22 Steven G. Kargl <kargl@gcc.gnu.org> * fortran/decl.c: Disallow procedure pointers with -std=f95. diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index 4f60b80..456a38c 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -110,8 +110,8 @@ typedef enum FMT_NONE, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD, FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_SIGN, FMT_BLANK, FMT_CHAR, FMT_P, FMT_IBOZ, FMT_F, - FMT_E, FMT_EXT, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END, FMT_ERROR, FMT_DC, - FMT_DP, FMT_T, FMT_TR, FMT_TL, FMT_STAR + FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END, + FMT_ERROR, FMT_DC, FMT_DP, FMT_T, FMT_TR, FMT_TL, FMT_STAR } format_token; @@ -417,8 +417,10 @@ format_lex (void) case 'E': c = next_char_not_space (&error); - if (c == 'N' || c == 'S') - token = FMT_EXT; + if (c == 'N' ) + token = FMT_EN; + else if (c == 'S') + token = FMT_ES; else { token = FMT_E; @@ -486,6 +488,26 @@ format_lex (void) } +static const char * +token_to_string (format_token t) +{ + switch (t) + { + case FMT_D: + return "D"; + case FMT_G: + return "G"; + case FMT_E: + return "E"; + case FMT_EN: + return "EN"; + case FMT_ES: + return "ES"; + default: + return ""; + } +} + /* Check a format statement. The format string, either from a FORMAT statement or a constant in an I/O statement has already been parsed by itself, and we are checking it for validity. The dual origin @@ -634,7 +656,8 @@ format_item_1: case FMT_IBOZ: case FMT_F: case FMT_E: - case FMT_EXT: + case FMT_EN: + case FMT_ES: case FMT_G: case FMT_L: case FMT_A: @@ -737,7 +760,8 @@ data_desc: case FMT_D: case FMT_E: case FMT_G: - case FMT_EXT: + case FMT_EN: + case FMT_ES: u = format_lex (); if (t == FMT_G && u == FMT_ZERO) { @@ -771,20 +795,35 @@ data_desc: break; } + if (u != FMT_POSINT) + { + format_locus.nextc += format_string_pos; + gfc_error_now ("Positive width required in format " + "specifier %s at %L", token_to_string (t), + &format_locus); + saved_token = u; + goto finished; + } + u = format_lex (); if (u == FMT_ERROR) goto fail; if (u != FMT_PERIOD) { /* Warn if -std=legacy, otherwise error. */ - if (mode != MODE_FORMAT) - format_locus.nextc += format_string_pos; + format_locus.nextc += format_string_pos; if (gfc_option.warn_std != 0) - gfc_error_now ("Period required in format specifier at %L", - &format_locus); + { + gfc_error_now ("Period required in format " + "specifier %s at %L", token_to_string (t), + &format_locus); + saved_token = u; + goto finished; + } else - gfc_warning ("Period required in format specifier at %L", - &format_locus); + gfc_warning ("Period required in format " + "specifier %s at %L", token_to_string (t), + &format_locus); saved_token = u; break; } |