diff mbox

[fortran] PR42852 -Wall warns about truncated lines when only a continuation character is truncated

Message ID 4C4BB728.4070707@verizon.net
State New
Headers show

Commit Message

Jerry DeLisle July 25, 2010, 4:01 a.m. UTC
Hi Folks,

This patch provides some enhancement for truncation warnings.

Fairly self explanatory.

Regression tested on x86-64-linuc-gnu.

OK for trunk?

Regards,

Jerry

2010-07-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR fortran/42852
	* scanner.c (gfc_next_char_literal): Move check for truncation earlier
	in the function so that it does not get missed by early exits.
	(load_line): Add checks for quoted strings and free form comments to
	disable warnings on comments. Add check for ampersand as first
	character after truncation and don't warn for this case, but warn if
	there are subsequent non-whitespace characters.

Comments

Tobias Burnus July 25, 2010, 9:23 a.m. UTC | #1
Jerry DeLisle wrote:
> This patch provides some enhancement for truncation warnings.
> Fairly self explanatory.
>
> Regression tested on x86-64-linuc-gnu.
> OK for trunk?

Not announced, but I like that with the patch gfortran also does no
longer warn if there are just trailing spaces or a comment ("!") which
starts after column 72.

 * * *

However, I do not like how free-form source code is handled: If I have a
long line (>132) of spaces followed by a continuation character, e.g.,

integer :: a  [many spaces]    &
, b
end

The error is:
, b
 1
Error: Invalid character in name at (1)

Expected: Additionally, one should see
   Warning: Line truncated at (1)
In case of free form code, the '&' is significant - and it can easily
happen that just the continuation character moves beyond column 132.

* * *

Actually, I just realised that your patch does not change the warning
for free-form code. Thus:

The patch is OK. Thanks!

Tobias

> 2010-07-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
>
>     PR fortran/42852
>     * scanner.c (gfc_next_char_literal): Move check for truncation
> earlier
>     in the function so that it does not get missed by early exits.
>     (load_line): Add checks for quoted strings and free form comments to
>     disable warnings on comments. Add check for ampersand as first
>     character after truncation and don't warn for this case, but warn if
>     there are subsequent non-whitespace characters.
diff mbox

Patch

Index: scanner.c
===================================================================
--- scanner.c	(revision 162507)
+++ scanner.c	(working copy)
@@ -1044,6 +1044,17 @@  restart:
 	  goto done;
 	}
 
+      /* Check to see if the continuation line was truncated.  */
+      if (gfc_option.warn_line_truncation && gfc_current_locus.lb != NULL
+	  && gfc_current_locus.lb->truncated)
+	{
+	  int maxlen = gfc_option.free_line_length;
+	  gfc_current_locus.lb->truncated = 0;
+	  gfc_current_locus.nextc += maxlen;
+	  gfc_warning_now ("Line truncated at %L", &gfc_current_locus);
+	  gfc_current_locus.nextc -= maxlen;
+	}
+
       if (c != '&')
 	goto done;
 
@@ -1095,17 +1106,6 @@  restart:
 	    }
 	}
 
-      /* Check to see if the continuation line was truncated.  */
-      if (gfc_option.warn_line_truncation && gfc_current_locus.lb != NULL
-	  && gfc_current_locus.lb->truncated)
-	{
-	  int maxlen = gfc_option.free_line_length;
-	  gfc_current_locus.lb->truncated = 0;
-	  gfc_current_locus.nextc += maxlen;
-	  gfc_warning_now ("Line truncated at %L", &gfc_current_locus);
-	  gfc_current_locus.nextc -= maxlen;
-	}
-
       /* Now find where it continues. First eat any comment lines.  */
       openmp_cond_flag = skip_free_comments ();
 
@@ -1420,7 +1420,7 @@  load_line (FILE *input, gfc_char_t **pbuf, int *pb
   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;
+  int seen_printable = 0, seen_ampersand = 0, quoted = ' ';
   gfc_char_t *buffer;
   bool found_tab = false;
 
@@ -1502,6 +1502,18 @@  load_line (FILE *input, gfc_char_t **pbuf, int *pb
 	  && (c == '*' || c == 'c' || c == 'd'))
 	seen_comment = 1;
 
+      if (quoted == ' ')
+	{
+	  if (c == '\'' || c == '"')
+	    quoted = c;
+	}
+      else if (c == quoted)
+	quoted = ' ';
+
+      /* Is this a free-form comment?  */
+      if (c == '!' && quoted == ' ')
+        seen_comment = 1;
+
       /* Vendor extension: "<tab>1" marks a continuation line.  */
       if (found_tab)
 	{
@@ -1550,17 +1562,33 @@  load_line (FILE *input, gfc_char_t **pbuf, int *pb
 	}
       else if (i >= maxlen)
 	{
+	  bool trunc_warn = true;
+
+	  /* Enhancement, if the very next non-space character is an ampersand
+	     or comment that we would otherwise warn about, don't mark as
+	     truncated.  */
+
 	  /* Truncate the rest of the line.  */
 	  for (;;)
 	    {
 	      c = getc (input);
-	      if (c == '\r')
+	      if (c == '\r' || c == ' ')
 	        continue;
 
 	      if (c == '\n' || c == EOF)
 		break;
 
-	      trunc_flag = 1;
+	      if (!trunc_warn && c != '!')
+		trunc_warn = true;
+
+	      if (trunc_warn && (c == '&' || c == '!'))
+		trunc_warn = false;
+
+	      if (c == '!')
+		seen_comment = 1;
+
+	      if (trunc_warn && !seen_comment)
+		trunc_flag = 1;
 	    }
 
 	  c = '\n';