This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix up diagnostics emitted by fortran FE load_line (PR fortran/89724)


Hi!

As reported in the PR, when glibc installs math-vector-fortran.h header,
e.g. continuation_9.f90 testcase breaks.
The problem is that load_line does its own current line counting and does
that as a rolling count of how many lines were seen already, ignoring
preprocessor line numbers, or includes from other files etc.
Unfortunately, to use %C we'd need gfc_locus which is only usable after
load_file returns and the caller updates it; it would be nice to emit at
least filename:line at the start of diagnostic, but it is unclear how to
achieve that easily.
So, this patch keeps using just the line numbers, just picks them up from
current_file->line where it stands for the current line in the current file.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-03-15  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/89724
	* scanner.c (load_line): Remove linenum and current_line static
	variables, add warned_tabs automatic variable.  Use current_file->line
	instead of current_line and warned_tabs boolean to avoid diagnosing
	tabs multiple times on the same line.

	* gfortran.dg/continuation_15.f90: New test.
	* gfortran.dg/continuation_16.f90: New test.

--- gcc/fortran/scanner.c.jj	2019-03-13 09:23:46.667383435 +0100
+++ gcc/fortran/scanner.c	2019-03-15 10:28:33.467897756 +0100
@@ -1738,12 +1738,12 @@ gfc_gobble_whitespace (void)
 static int
 load_line (FILE *input, gfc_char_t **pbuf, int *pbuflen, const int *first_char)
 {
-  static int linenum = 0, current_line = 1;
   int c, maxlen, i, preprocessor_flag, buflen = *pbuflen;
   int trunc_flag = 0, seen_comment = 0;
   int seen_printable = 0, seen_ampersand = 0, quoted = ' ';
   gfc_char_t *buffer;
   bool found_tab = false;
+  bool warned_tabs = false;
 
   /* Determine the maximum allowed line length.  */
   if (gfc_current_form == FORM_FREE)
@@ -1793,10 +1793,10 @@ load_line (FILE *input, gfc_char_t **pbu
 	    {
 	      if (pedantic)
 		gfc_error_now ("%<&%> not allowed by itself in line %d",
-			       current_line);
+			       current_file->line);
 	      else
 		gfc_warning_now (0, "%<&%> not allowed by itself in line %d",
-				 current_line);
+				 current_file->line);
 	    }
 	  break;
 	}
@@ -1850,12 +1850,12 @@ load_line (FILE *input, gfc_char_t **pbu
 	{
 	  found_tab = true;
 
-	  if (warn_tabs && seen_comment == 0 && current_line != linenum)
+	  if (warn_tabs && seen_comment == 0 && !warned_tabs)
 	    {
-	      linenum = current_line;
+	      warned_tabs = true;
 	      gfc_warning_now (OPT_Wtabs,
 			       "Nonconforming tab character in column %d "
-			       "of line %d", i+1, linenum);
+			       "of line %d", i + 1, current_file->line);
 	    }
 
 	  while (i < 6)
@@ -1934,7 +1934,6 @@ next_char:
 
   *buffer = '\0';
   *pbuflen = buflen;
-  current_line++;
 
   return trunc_flag;
 }
--- gcc/testsuite/gfortran.dg/continuation_15.f90.jj	2019-03-15 10:37:48.338823839 +0100
+++ gcc/testsuite/gfortran.dg/continuation_15.f90	2019-03-15 10:37:42.924912371 +0100
@@ -0,0 +1,9 @@
+! PR fortran/89724
+! { dg-do compile }
+! { dg-options "-std=f95" }
+
+include 'continuation_9.f90'
+
+! { dg-warning "not allowed by itself in line 3" "" { target *-*-* } 0 }
+! { dg-warning "not allowed by itself in line 4" "" { target *-*-* } 0 }
+! { dg-warning "not allowed by itself in line 5" "" { target *-*-* } 0 }
--- gcc/testsuite/gfortran.dg/continuation_16.f90.jj	2019-03-15 10:39:21.750296254 +0100
+++ gcc/testsuite/gfortran.dg/continuation_16.f90	2019-03-15 10:40:49.036868837 +0100
@@ -0,0 +1,10 @@
+! PR fortran/89724
+! { dg-do compile }
+! { dg-options "-std=f95 -nostdinc -fpre-include=simd-builtins-1.h" }
+  &  
+&
+ &
+end
+! { dg-warning "not allowed by itself in line 4" "" { target *-*-* } 0 }
+! { dg-warning "not allowed by itself in line 5" "" { target *-*-* } 0 }
+! { dg-warning "not allowed by itself in line 6" "" { target *-*-* } 0 }

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]