2012-07-17 Tobias Burnus <burnus@net-b.de>
PR fortran/53993
* scanner.c (preprocessor_line): Fix parsing of a "#line"
which has no flags, add new parameter.
(load_file): Update the call.
2012-07-17 Tobias Burnus <burnus@net-b.de>
PR fortran/53993
* gfortran.dg/debug_3.F90: New.
@@ -1646,7 +1646,7 @@ get_file (const char *name, enum lc_reason reason ATTRIBUTE_UNUSED)
initial octothorp has already been seen. */
static void
-preprocessor_line (gfc_char_t *c)
+preprocessor_line (gfc_char_t *c, bool ignore_line)
{
bool flag[5];
int i, line;
@@ -1654,6 +1654,9 @@ preprocessor_line (gfc_char_t *c)
gfc_file *f;
int escaped, unescape;
char *filename;
+ enum {FLAG_NEW_FILE = 1, FLAG_PREV_FILE, FLAG_SYSHEADER, FLAG_EXTERN_C};
+
+ /* The expected syntax is "# linenumber filename flags". */
c++;
while (*c == ' ' || *c == '\t')
@@ -1739,20 +1742,25 @@ preprocessor_line (gfc_char_t *c)
flag[i] = true;
}
+ /* No flag implies that one might have a new file. However, we have to skip
+ over the first three lines of a cpp'ed file. */
+ if (!flag[FLAG_NEW_FILE] && !flag[FLAG_PREV_FILE] && !ignore_line)
+ flag[FLAG_NEW_FILE] = true;
+
/* Convert the filename in wide characters into a filename in narrow
characters. */
filename = gfc_widechar_to_char (wide_filename, -1);
/* Interpret flags. */
- if (flag[1]) /* Starting new file. */
+ if (flag[FLAG_NEW_FILE]) /* Starting new file. */
{
f = get_file (filename, LC_RENAME);
add_file_change (f->filename, f->inclusion_line);
current_file = f;
}
- if (flag[2]) /* Ending current file. */
+ if (flag[FLAG_PREV_FILE]) /* Ending current file. */
{
if (!current_file->up
|| filename_cmp (current_file->up->filename, filename) != 0)
@@ -1959,12 +1967,12 @@ load_file (const char *realfilename, const char *displayedname, bool initial)
if (initial && gfc_src_preprocessor_lines[0])
{
- preprocessor_line (gfc_src_preprocessor_lines[0]);
+ preprocessor_line (gfc_src_preprocessor_lines[0], initial);
free (gfc_src_preprocessor_lines[0]);
gfc_src_preprocessor_lines[0] = NULL;
if (gfc_src_preprocessor_lines[1])
{
- preprocessor_line (gfc_src_preprocessor_lines[1]);
+ preprocessor_line (gfc_src_preprocessor_lines[1], initial);
free (gfc_src_preprocessor_lines[1]);
gfc_src_preprocessor_lines[1] = NULL;
}
@@ -2015,7 +2023,7 @@ load_file (const char *realfilename, const char *displayedname, bool initial)
;
else
{
- preprocessor_line (line);
+ preprocessor_line (line, first_line);
continue;
}
}
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original-lineno" }
+!
+! PR fortran/53993
+!
+! Contributed by Markus Geimer
+!
+program dummy
+ write(*,*) "Starting dummy"
+#line 444 "newFile.f90"
+ call foo
+ write(*,*) "Stopping dummy"
+#line 455 "newFile.f90"
+end program dummy
+#line 16 "debug_3.F90"
+
+subroutine foo
+ write(*,*) "Hello world!"
+end subroutine foo
+
+! { dg-final { scan-tree-dump "newFile.f90 : 444" "original" } }
+! { dg-final { scan-tree-dump "newFile.f90 : 445" "original" } }
+! { dg-final { scan-tree-dump "newFile.f90 : 455" "original" } }
+
+! { dg-final { scan-tree-dump "debug_3.F90 : 18" "original" } }