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,fortran] PR42852 -Wall warns about truncated lines when only a continuation character is truncated


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.


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';
c { dg-do compile }
c { dg-options "-Wall" }
c PR42852 -Wall warns about truncated lines when only a continuation character is truncated
      print *, "Hello!"                                                  &   !xxxxx
     & //   " World!"
      print *, "Hello!"                                                  &   xxxxx
     & //   " World!"
      print *, "Hello!"                                                  //
     & //   " World!"
      end
c { dg-warning "Line truncated" " " { target *-*-* } 6 }
c { dg-warning "Line truncated" " " { target *-*-* } 8 }

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