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] PR19261 continuation character illegal as first non-blank character in statement


:ADDPATCH fortran:

The attached patch adds warnings for illegal use of '&' in lines. This follows from F95 Standard 3.3.1.3. With -pedantic errors are given instead of warnings.

I moved the note about the unavailable error machinery to the top of load_line since it applies to more than one place in this function.

If someone can figure out how to get that test case to work with the deja-magic, I would appreciate it. Can't get rid of the excess warnings tests with -S

Regression tested and libgomp tested OK. The libgomp tests require Jacub's patch that fixes the PR19260 fix breakage.

OK to commit to 4.2?

Regards,

Jerry

2006-10-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>

	PR fortran/19261
	* scanner.c (load_line): Add checks for illegal use of '&' and issue
	warnings.  Issue errors with -pedantic.
Index: scanner.c
===================================================================
*** scanner.c	(revision 117424)
--- scanner.c	(working copy)
*************** gfc_gobble_whitespace (void)
*** 931,937 ****
     In fixed mode, we expand a tab that occurs within the statement
     label region to expand to spaces that leave the next character in
     the source region.
!    load_line returns whether the line was truncated.  */
  
  static int
  load_line (FILE * input, char **pbuf, int *pbuflen)
--- 931,941 ----
     In fixed mode, we expand a tab that occurs within the statement
     label region to expand to spaces that leave the next character in
     the source region.
!    load_line returns whether the line was truncated.
! 
!    NOTE: The error machinery isn't available at this point, so we can't
! 	 easily report line and column numbers consistent with other 
! 	 parts of gfortran.  */
  
  static int
  load_line (FILE * input, char **pbuf, int *pbuflen)
*************** load_line (FILE * input, char **pbuf, in
*** 939,944 ****
--- 943,949 ----
    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;
    char *buffer;
  
    /* Determine the maximum allowed line length.
*************** load_line (FILE * input, char **pbuf, in
*** 990,996 ****
        if (c == EOF)
  	break;
        if (c == '\n')
! 	break;
  
        if (c == '\r')
  	continue;		/* Gobble characters.  */
--- 995,1014 ----
        if (c == EOF)
  	break;
        if (c == '\n')
! 	{
! 	  /* Check for illegal use of ampersand. See F95 Standard 3.3.1.3.  */
! 	  if (gfc_current_form == FORM_FREE 
! 		&& !seen_printable && seen_ampersand)
! 	    {
! 	      if (pedantic)
! 		gfc_error_now
! 		  ("'&' not allowed by itself in line %d", current_line);
! 	      else
! 		gfc_warning_now
! 		  ("'&' not allowed by itself in line %d", current_line);
! 	    }
! 	  break;
! 	}
  
        if (c == '\r')
  	continue;		/* Gobble characters.  */
*************** load_line (FILE * input, char **pbuf, in
*** 1004,1009 ****
--- 1022,1046 ----
  	  break;
  	}
  
+       /* Check for illegal use of ampersand. See F95 Standard 3.3.1.3.  */
+       if (c == '&')
+ 	seen_ampersand = 1;
+ 
+       if ((c != ' ' && c != '&' && c != '!') || (c == '!' && !seen_ampersand))
+ 	seen_printable = 1;
+       
+       if (gfc_current_form == FORM_FREE 
+ 	    && c == '!' && !seen_printable && seen_ampersand)
+ 	{
+ 	  if (pedantic)
+ 	    gfc_error_now (
+ 	      "'&' not allowed by itself with comment in line %d", current_line);
+ 	  else
+ 	    gfc_warning_now (
+ 	      "'&' not allowed by itself with comment in line %d", current_line);
+ 	  seen_printable = 1;
+ 	}
+ 
        /* Is this a fixed-form comment?  */
        if (gfc_current_form == FORM_FIXED && i == 0
  	  && (c == '*' || c == 'c' || c == 'd'))
*************** load_line (FILE * input, char **pbuf, in
*** 1011,1019 ****
  
        if (gfc_current_form == FORM_FIXED && c == '\t' && i <= 6)
  	{
- 	  /* The error machinery isn't available at this point, so we can't
- 	     easily report line and column numbers consistent with other 
- 	     parts of gfortran.  */
  	  if (!gfc_option.warn_tabs && seen_comment == 0
  	      && current_line != linenum)
  	    {
--- 1048,1053 ----
! { dg-do compile }
! PR19261 test fix for illegal ampersands in lines.
! Submitted by Jerry DeLisle  <jvdelisle@gcc.gnu.org>
print *, 12345
   ! &  !
   print *, 123&
   &45  
   print *, 54321&
   &   ! { dg-warning "not allowed by itself with comment in line" } 
end

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