Patchwork [Fortran] Fix #line parsing

login
register
mail settings
Submitter Tobias Burnus
Date July 17, 2012, 6:52 p.m.
Message ID <5005B454.9020608@net-b.de>
Download mbox | patch
Permalink /patch/171540/
State New
Headers show

Comments

Tobias Burnus - July 17, 2012, 6:52 p.m.
gfortran properly handles the "#line" which come from #include 
statements and look as

# 1234 "include_file_name.f90" 1

Here, the syntax is "# linenumber filename flags", where flags is a 
space-delimited list of the flags 1,2,3, or 4. The problem is that the 
gfortran didn't handle the case of having no flag.

Additionally, I now also go through the new-file handling for system 
headers.

Build and regtested on x86-64-gnu-linux.
OK for the trunk?

Tobias

PS: I didn't include a test case; one could create one using 
-fdump-tree-original-lineno, if you think that it makes sense.
Mikael Morin - July 17, 2012, 7:04 p.m.
On 17/07/2012 20:52, Tobias Burnus wrote:
> gfortran properly handles the "#line" which come from #include
> statements and look as
> 
> # 1234 "include_file_name.f90" 1
> 
> Here, the syntax is "# linenumber filename flags", where flags is a
> space-delimited list of the flags 1,2,3, or 4. The problem is that the
> gfortran didn't handle the case of having no flag.
> 
> Additionally, I now also go through the new-file handling for system
> headers.
> 
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?
> 
> Tobias
> 
> PS: I didn't include a test case; one could create one using
> -fdump-tree-original-lineno, if you think that it makes sense.

OK; I prefer with a testcase.
Thanks.

Mikael

Patch

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.

diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index 4fad58b..df9f01d 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -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,24 @@  preprocessor_line (gfc_char_t *c)
 	flag[i] = true;
     }
 
+  /* No flag implies that one might have a new file.  */
+  if (!flag[FLAG_NEW_FILE] && !flag[FLAG_PREV_FILE] && !flag[FLAG_SYSHEADER])
+    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] || flag[FLAG_SYSHEADER]) /* 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)