This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[Patch, fortran] Fix bogus warning with continued lines
- From: Tobias Burnus <burnus at net-b dot de>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>, "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>
- Date: Tue, 27 Feb 2007 17:07:28 +0100
- Subject: [Patch, fortran] Fix bogus warning with continued lines
:ADDPATCH fortran:
Fortran allows strings to continue by placing a & as last character in
the line:
print *, "Hello&
& World"
gfortran supports as extension:
print *, "Hello&
World"
With either -Wall, -pedantic or -std=f95/f2003 the following error is shown:
Warning: Missing '&' in continued character constant at (1)
However, the same message is (wrongly) shown for
print *, "Hello"&
, " World"&
// "!"
The problem is that next_string_char read the " and needs to read the
next character to check it is not another ". It erroneously calls
gfc_next_char_literal with the option in_string = 1, which causes it to
read up to the comma or slash.
The following patch corrects this and ensures also that the warning
message is printed only once.
Thanks to Harald Anlauf for the report.
Bootstrapped and regression tested on x86-64/Linux.
Ok for the trunk and 4.2? (As it is only a warning, I think we can omit
4.1.)
Tobias
2007-02-27 Tobias Burnus <burnus@net-b.de>
PR fortran/30968
* primary.c (next_string_char): Correct reading a character
after the delimiter.
(match_string_constant): Print warning message only once.
2007-02-27 Tobias Burnus <burnus@net-b.de>
PR fortran/30968
* gfortran.dg/continuation_7.f90: New test.
Index: gcc/fortran/primary.c
===================================================================
*** gcc/fortran/primary.c (revision 122377)
--- gcc/fortran/primary.c (working copy)
*************** next_string_char (char delimiter)
*** 773,779 ****
return c;
old_locus = gfc_current_locus;
! c = gfc_next_char_literal (1);
if (c == delimiter)
return c;
--- 773,779 ----
return c;
old_locus = gfc_current_locus;
! c = gfc_next_char_literal (0);
if (c == delimiter)
return c;
*************** static match
*** 852,858 ****
match_string_constant (gfc_expr **result)
{
char *p, name[GFC_MAX_SYMBOL_LEN + 1];
! int i, c, kind, length, delimiter;
locus old_locus, start_locus;
gfc_symbol *sym;
gfc_expr *e;
--- 852,858 ----
match_string_constant (gfc_expr **result)
{
char *p, name[GFC_MAX_SYMBOL_LEN + 1];
! int i, c, kind, length, delimiter, warn_ampersand;
locus old_locus, start_locus;
gfc_symbol *sym;
gfc_expr *e;
*************** got_delim:
*** 979,988 ****
--- 979,994 ----
gfc_current_locus = start_locus;
gfc_next_char (); /* Skip delimiter */
+ /* We disable the warning for the following loop as the warning has already
+ been printed in the loop above. */
+ warn_ampersand = gfc_option.warn_ampersand;
+ gfc_option.warn_ampersand = 0;
+
for (i = 0; i < length; i++)
*p++ = next_string_char (delimiter);
*p = '\0'; /* TODO: C-style string is for development/debug purposes. */
+ gfc_option.warn_ampersand = warn_ampersand;
if (next_string_char (delimiter) != -1)
gfc_internal_error ("match_string_constant(): Delimiter not found");
Index: gcc/testsuite/gfortran.dg/continuation_7.f90
===================================================================
*** gcc/testsuite/gfortran.dg/continuation_7.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/continuation_7.f90 (revision 0)
***************
*** 0 ****
--- 1,22 ----
+ ! { dg-do "compile" }
+ ! { dg-options "-Wall -std=f95" }
+ ! There should only two warnings be printed.
+ ! PR fortran/30968
+ print *, "Foo bar&
+ &Bar foo"
+ print *, "Foo bar&
+ Bar foo" ! { dg-warning "Missing '&' in continued character constant" }
+ print *, "Foo bar"&
+ &, "Bar foo"
+ print *, "Foo bar"&
+ , "Bar foo"
+
+ print '(&
+ a)', 'Hello' ! { dg-warning "Missing '&' in continued character constant" }
+ print '(&
+ &a)', 'Hello'
+ print '('&
+ &//'a)', 'Hello'
+ print '('&
+ // "a)", 'Hello'
+ end