* [PATCH] PR fortran/58001 -- Handle tab in FORMAT
@ 2016-11-16 21:37 Steve Kargl
0 siblings, 0 replies; only message in thread
From: Steve Kargl @ 2016-11-16 21:37 UTC (permalink / raw)
To: fortran, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 558 bytes --]
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
[-- Attachment #2: pr58001.diff --]
[-- Type: text/x-diff, Size: 4803 bytes --]
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" }
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2016-11-16 21:37 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-16 21:37 [PATCH] PR fortran/58001 -- Handle tab in FORMAT Steve Kargl
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).