aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/io.c
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2008-12-21 21:20:29 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2008-12-21 21:20:29 +0000
commitc8129db1047d3133c1acea369d91424e150bce22 (patch)
tree26160a925575637d59156978296bc6c30ac98399 /gcc/fortran/io.c
parentddb8401a53f0705fd42e91b931144097d0733f61 (diff)
downloadgcc-c8129db1047d3133c1acea369d91424e150bce22.zip
gcc-c8129db1047d3133c1acea369d91424e150bce22.tar.gz
gcc-c8129db1047d3133c1acea369d91424e150bce22.tar.bz2
re PR fortran/38398 (g0.w edit descriptor: Update for F2008 Tokyo meeting changes)
2008-12-21 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/38398 * io.c: Add error checks for g0 formatting and provide adjustment of error loci for improved error messages. From-SVN: r142870
Diffstat (limited to 'gcc/fortran/io.c')
-rw-r--r--gcc/fortran/io.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 98112fc..57e65f8 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -118,6 +118,7 @@ format_token;
used to back up by a single format token during the parsing
process. */
static gfc_char_t *format_string;
+static int format_string_pos;
static int format_length, use_last_char;
static char error_element;
static locus format_locus;
@@ -170,6 +171,8 @@ next_char (int in_string)
if (mode != MODE_STRING)
format_locus = gfc_current_locus;
+ format_string_pos++;
+
c = gfc_wide_toupper (c);
return c;
}
@@ -503,6 +506,7 @@ check_format (bool is_input)
level = 0;
repeat = 0;
rv = SUCCESS;
+ format_string_pos = 0;
t = format_lex ();
if (t == FMT_ERROR)
@@ -729,15 +733,19 @@ data_desc:
saved_token = u;
break;
}
-
u = format_lex ();
- if (u == FMT_ERROR)
- goto fail;
if (u != FMT_POSINT)
{
error = posint_required;
goto syntax;
}
+ u = format_lex ();
+ if (u == FMT_E)
+ {
+ error = _("E specifier not allowed with g0 descriptor");
+ goto syntax;
+ }
+ saved_token = u;
break;
}
@@ -983,6 +991,8 @@ extension_optional_comma:
goto format_item;
syntax:
+ if (mode != MODE_FORMAT)
+ format_locus.nextc += format_string_pos;
if (error == unexpected_element)
gfc_error (error, error_element, &format_locus);
else