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
This commit is contained in:
Jerry DeLisle 2008-12-21 21:20:29 +00:00
parent ddb8401a53
commit c8129db104
2 changed files with 19 additions and 3 deletions

View File

@ -1,3 +1,9 @@
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.
2008-12-21 Arjen Markus <arjen.markus@wldelft.nl> 2008-12-21 Arjen Markus <arjen.markus@wldelft.nl>
Daniel Kraft <d@domob.eu> Daniel Kraft <d@domob.eu>

View File

@ -118,6 +118,7 @@ format_token;
used to back up by a single format token during the parsing used to back up by a single format token during the parsing
process. */ process. */
static gfc_char_t *format_string; static gfc_char_t *format_string;
static int format_string_pos;
static int format_length, use_last_char; static int format_length, use_last_char;
static char error_element; static char error_element;
static locus format_locus; static locus format_locus;
@ -170,6 +171,8 @@ next_char (int in_string)
if (mode != MODE_STRING) if (mode != MODE_STRING)
format_locus = gfc_current_locus; format_locus = gfc_current_locus;
format_string_pos++;
c = gfc_wide_toupper (c); c = gfc_wide_toupper (c);
return c; return c;
} }
@ -503,6 +506,7 @@ check_format (bool is_input)
level = 0; level = 0;
repeat = 0; repeat = 0;
rv = SUCCESS; rv = SUCCESS;
format_string_pos = 0;
t = format_lex (); t = format_lex ();
if (t == FMT_ERROR) if (t == FMT_ERROR)
@ -729,15 +733,19 @@ data_desc:
saved_token = u; saved_token = u;
break; break;
} }
u = format_lex (); u = format_lex ();
if (u == FMT_ERROR)
goto fail;
if (u != FMT_POSINT) if (u != FMT_POSINT)
{ {
error = posint_required; error = posint_required;
goto syntax; goto syntax;
} }
u = format_lex ();
if (u == FMT_E)
{
error = _("E specifier not allowed with g0 descriptor");
goto syntax;
}
saved_token = u;
break; break;
} }
@ -983,6 +991,8 @@ extension_optional_comma:
goto format_item; goto format_item;
syntax: syntax:
if (mode != MODE_FORMAT)
format_locus.nextc += format_string_pos;
if (error == unexpected_element) if (error == unexpected_element)
gfc_error (error, error_element, &format_locus); gfc_error (error, error_element, &format_locus);
else else