summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/primary.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/continuation_7.f9022
4 files changed, 42 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d4b548db7f2..32bf7e63da5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2007-02-28 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 Richard Guenther <rguenther@suse.de>
* trans-array.c (structure_alloc_comps): Use correct type
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 4649b4ca02b..3044703357a 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -773,7 +773,7 @@ next_string_char (char delimiter)
return c;
old_locus = gfc_current_locus;
- c = gfc_next_char_literal (1);
+ c = gfc_next_char_literal (0);
if (c == delimiter)
return c;
@@ -852,7 +852,7 @@ static match
match_string_constant (gfc_expr **result)
{
char *p, name[GFC_MAX_SYMBOL_LEN + 1];
- int i, c, kind, length, delimiter;
+ int i, c, kind, length, delimiter, warn_ampersand;
locus old_locus, start_locus;
gfc_symbol *sym;
gfc_expr *e;
@@ -979,10 +979,16 @@ got_delim:
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");
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8552b1c63a9..1261449aa72 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-02-28 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/30968
+ * gfortran.dg/continuation_7.f90: New test.
+
2007-02-28 Bernd Schmidt <bernd.schmidt@analog.com>
* g++.dg/inherit/thunk7.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/continuation_7.f90 b/gcc/testsuite/gfortran.dg/continuation_7.f90
new file mode 100644
index 00000000000..0a761889ba9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/continuation_7.f90
@@ -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