OSDN Git Service

2008-12-21 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 21 Dec 2008 21:20:29 +0000 (21:20 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 21 Dec 2008 21:20:29 +0000 (21:20 +0000)
PR fortran/38398
* io.c: Add error checks for g0 formatting and provide adjustment of
error loci for improved error messages.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142870 138bc75d-0d04-0410-961f-82ee72b054a4

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

index eaa496d..b3e3034 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 98112fc..57e65f8 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