]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/38398 (g0.w edit descriptor: Update for F2008 Tokyo meeting changes)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 21 Dec 2008 21:20:29 +0000 (21:20 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 21 Dec 2008 21:20:29 +0000 (21:20 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/io.c

index eaa496da8681e18d2ed1ebe94c3326a3b202990b..b3e3034857b9e4755f3289687110b655c1c432e1 100644 (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>
            Daniel Kraft  <d@domob.eu>
 
index 98112fcb8a8fd06e42756aca2b1de6097e7a1fe4..57e65f85422f604596cb12868eeca909fae1c12f 100644 (file)
@@ -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