diff mbox

PR fortran/58001 -- Handle tab in FORMAT

Message ID 20161116213726.GA67287@troutmask.apl.washington.edu
State New
Headers show

Commit Message

Steve Kargl Nov. 16, 2016, 9:37 p.m. UTC
An earlier version of the attached patch lingered in bugzilla
for over 3 years.  I've updated the patch to include Manuel's
comment #12.  Regression tested on x86_64-*-freebsd.  OK to
commit?

2016-11-16  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/58001
	* io.c (next_char_not_space): Update handling of a 'tab' in a FORMAT.
 	(format_lex): Adjust invocations of next_char_not_space().
 
2016-11-16  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/58001
	* gfortran.dg/fmt_tab_1.f90: Adjust testcase.
	* gfortran.dg/fmt_tab_2.f90: Ditto.

-- 
Steve
diff mbox

Patch

Index: gcc/fortran/io.c
===================================================================
--- gcc/fortran/io.c	(revision 242512)
+++ gcc/fortran/io.c	(working copy)
@@ -200,23 +200,14 @@  unget_char (void)
 /* Eat up the spaces and return a character.  */
 
 static char
-next_char_not_space (bool *error)
+next_char_not_space ()
 {
   char c;
   do
     {
       error_element = c = next_char (NONSTRING);
       if (c == '\t')
-	{
-	  if (gfc_option.allow_std & GFC_STD_GNU)
-	    gfc_warning (0, "Extension: Tab character in format at %C");
-	  else
-	    {
-	      gfc_error ("Extension: Tab character in format at %C");
-	      *error = true;
-	      return c;
-	    }
-	}
+	gfc_warning (OPT_Wtabs, "Nonconforming tab character in format at %C");
     }
   while (gfc_is_whitespace (c));
   return c;
@@ -234,7 +225,6 @@  format_lex (void)
   char c, delim;
   int zflag;
   int negative_flag;
-  bool error = false;
 
   if (saved_token != FMT_NONE)
     {
@@ -243,7 +233,7 @@  format_lex (void)
       return token;
     }
 
-  c = next_char_not_space (&error);
+  c = next_char_not_space ();
   
   negative_flag = 0;
   switch (c)
@@ -253,7 +243,7 @@  format_lex (void)
       /* Falls through.  */
 
     case '+':
-      c = next_char_not_space (&error);
+      c = next_char_not_space ();
       if (!ISDIGIT (c))
 	{
 	  token = FMT_UNKNOWN;
@@ -264,7 +254,7 @@  format_lex (void)
 
       do
 	{
-	  c = next_char_not_space (&error);
+	  c = next_char_not_space ();
 	  if (ISDIGIT (c))
 	    value = 10 * value + c - '0';
 	}
@@ -294,7 +284,7 @@  format_lex (void)
 
       do
 	{
-	  c = next_char_not_space (&error);
+	  c = next_char_not_space ();
 	  if (ISDIGIT (c))
 	    {
 	      value = 10 * value + c - '0';
@@ -329,7 +319,7 @@  format_lex (void)
       break;
 
     case 'T':
-      c = next_char_not_space (&error);
+      c = next_char_not_space ();
       switch (c)
 	{
 	case 'L':
@@ -357,7 +347,7 @@  format_lex (void)
       break;
 
     case 'S':
-      c = next_char_not_space (&error);
+      c = next_char_not_space ();
       if (c != 'P' && c != 'S')
 	unget_char ();
 
@@ -365,7 +355,7 @@  format_lex (void)
       break;
 
     case 'B':
-      c = next_char_not_space (&error);
+      c = next_char_not_space ();
       if (c == 'N' || c == 'Z')
 	token = FMT_BLANK;
       else
@@ -427,7 +417,7 @@  format_lex (void)
       break;
 
     case 'E':
-      c = next_char_not_space (&error);
+      c = next_char_not_space ();
       if (c == 'N' )
 	token = FMT_EN;
       else if (c == 'S')
@@ -457,7 +447,7 @@  format_lex (void)
       break;
 
     case 'D':
-      c = next_char_not_space (&error);
+      c = next_char_not_space ();
       if (c == 'P')
 	{
 	  if (!gfc_notify_std (GFC_STD_F2003, "DP format "
@@ -478,7 +468,7 @@  format_lex (void)
 	      "specifier not allowed at %C"))
 	    return FMT_ERROR;
 	  token = FMT_DT;
-	  c = next_char_not_space (&error);
+	  c = next_char_not_space ();
 	  if (c == '\'' || c == '"')
 	    {
 	      delim = c;
@@ -518,7 +508,7 @@  format_lex (void)
       break;
 
     case 'R':
-      c = next_char_not_space (&error);
+      c = next_char_not_space ();
       switch (c)
 	{
 	case 'C':
@@ -559,9 +549,6 @@  format_lex (void)
       break;
     }
 
-  if (error)
-    return FMT_ERROR;
-
   return token;
 }
 
Index: gcc/testsuite/gfortran.dg/fmt_tab_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/fmt_tab_1.f90	(revision 242512)
+++ gcc/testsuite/gfortran.dg/fmt_tab_1.f90	(working copy)
@@ -1,7 +1,12 @@ 
 ! { dg-do compile }
-! { dg-options -Wno-error=tabs }
+! { dg-options -Wtabs }
 ! PR fortran/32987
+! PR fortran/58001
       program TestFormat
         write (*, 10)
- 10     format ('Hello ',	'bug!') ! { dg-warning "Extension: Tab character in format" }
+        ! There is a tab character before 'bug!'.  This is accepted without
+        ! the -Wno-tabs option or a -std= option.
+ 10     format ('Hello ',	'bug!') ! { dg-warning "tab character in format" }
+
       end
+! { dg-excess-errors "tab character in format" }
Index: gcc/testsuite/gfortran.dg/fmt_tab_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/fmt_tab_2.f90	(revision 242512)
+++ gcc/testsuite/gfortran.dg/fmt_tab_2.f90	(working copy)
@@ -1,7 +1,9 @@ 
 ! { dg-do compile }
 ! { dg-options "-std=f2003" }
 ! PR fortran/32987
+! PR fortran/58001
       program TestFormat
-        write (*, 10) ! { dg-error "FORMAT label 10 at .1. not defined" }
- 10     format ('Hello ',	'bug!') ! { dg-error "Extension: Tab character in format|Nonconforming tab character" }
+        write (*, 10)
+ 10     format ('Hello ',	'bug!') ! { dg-warning "tab character in format" }
       end
+! { dg-excess-errors "tab character in FORMAT" }