This fixes the gfortran.dg/continuation_6.f fails testsuite fails with
newer GLIBC.
The continuation line handling assumes that the line number starts at 0
(→ continue_line) and then can be incremented, if needed.
The problem came up with -pre_include, which is used with newer GLIBC to
provide things like "!GCC$ builtin (cos) attributes simd (notinbranch)
if('x86_64')".
There, first the file math-vector-fortran.h file is loaded, then the
actual file. The 'continue_line' gets incremented for
math-vector-fortran.h but nothing resets it before parsing the actual
input file. For the 'include_stmt' function, the reset happens during
parsing – while for our case, this knowledge is only in the line
information, but on file change, 'continue_line' is not updated/reset.
I think the same issue can occur with #include, especially as one plays
with #line, but I have not actually tested it. Obviously, if one plays
around with #line during a continuation block, this check won't work
either. However, it should fix the most common occurrence.
Additionally, I have removed the ATTRIBUTE_UNUSED from get_file's
'reason' as it is used in the linemap_add call.
And I have moved the OpenMP/OpenACC comment before if openmp/openacc
condition, where in my opinion it belongs to.
OK for the trunk?
Tobias
2019-11-07 Tobias Burnus <tob...@codesourcery.com
PR fortran/91253
* scanner.c (skip_fixed_comments): Move comment
lines to next if block.
(gfc_next_char_literal): Fix continue_line setting.
(get_file): Remove bogus ATTRIBUTE_UNUSED.
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index e54d483baff..40c06b6b674 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -1050,6 +1050,10 @@ skip_fixed_comments (void)
return;
}
+ if (gfc_current_locus.lb != NULL
+ && continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
+ continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
+
/* If -fopenmp/-fopenacc, we need to handle here 2 things:
1) don't treat !$omp/!$acc|c$omp/c$acc|*$omp / *$acc as comments,
but directives
@@ -1057,10 +1061,6 @@ skip_fixed_comments (void)
!$|c$|*$ should be treated as 2 spaces if the characters
in columns 3 to 6 are valid fixed form label columns
characters. */
- if (gfc_current_locus.lb != NULL
- && continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
- continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
-
if ((flag_openmp || flag_openmp_simd) && !flag_openacc)
{
if (next_char () == '$')
@@ -1313,6 +1313,14 @@ restart:
if (flag_openacc)
prev_openacc_flag = openacc_flag;
+ /* This can happen if the input file changed or via cpp's #line
+ without getting reset (e.g. via input_stmt). It also happens
+ when pre-including files via -fpre-include=. */
+ if (continue_count == 0
+ && gfc_current_locus.lb
+ && continue_line > gfc_linebuf_linenum (gfc_current_locus.lb) + 1)
+ continue_line = gfc_linebuf_linenum (gfc_current_locus.lb) + 1;
+
continue_flag = 1;
if (c == '!')
skip_comment_line ();
@@ -1475,6 +1483,14 @@ restart:
if (flag_openacc)
prev_openacc_flag = openacc_flag;
+ /* This can happen if the input file changed or via cpp's #line
+ without getting reset (e.g. via input_stmt). It also happens
+ when pre-including files via -fpre-include=. */
+ if (continue_count == 0
+ && gfc_current_locus.lb
+ && continue_line > gfc_linebuf_linenum (gfc_current_locus.lb) + 1)
+ continue_line = gfc_linebuf_linenum (gfc_current_locus.lb) + 1;
+
continue_flag = 1;
old_loc = gfc_current_locus;
@@ -1943,7 +1959,7 @@ next_char:
the file stack. */
static gfc_file *
-get_file (const char *name, enum lc_reason reason ATTRIBUTE_UNUSED)
+get_file (const char *name, enum lc_reason reason)
{
gfc_file *f;