[patch, fortran] PR31495 Is this continuation line legal?

Jerry DeLisle jvdelisle@verizon.net
Sat Apr 21 21:26:00 GMT 2007


:ADDPATCH fortran:
forgot that
Jerry DeLisle wrote:
> The answer to the bug reporters question is 'yes'.
> 
> I started to do some analysis on this and ended up with a state diagram 
> with at least 6 states.  I then worked up a test program with a rewrite 
> of this section of code, dutifully implementing the state machine.
> 
> Then I decided this is too complicated and not worth it.
> 
> So I came up with the attached patch.  I alternate the value of 
> seen_ampersand in case someone does something stupid and puts multiple 
> '&' on a line.
> 
> I eliminated the check for the lone '&' with comments, because a '!' is 
> perfectly legit in a quoted string.  I realize I could get more 
> sophisticated in here and I may submit a later patch with a full blown 
> state machine.  For now, I think this is sufficient to close this bug.
> 
> Regression tested and new test case.
> 
> OK for trunk?
> 
> Regards,
> 
> Jerry
> 
> 2007-04-21  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
> 
>     PR fortran/31495
>     * scanner.c (load_line):  Remove check for comment after ampersand and
>     adjust tracking of ampersand.
> 
> 
> ------------------------------------------------------------------------
> 
> Index: scanner.c
> ===================================================================
> *** scanner.c	(revision 124014)
> --- scanner.c	(working copy)
> *************** load_line (FILE *input, char **pbuf, int
> *** 1050,1056 ****
>   	{
>   	  /* 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",
> --- 1050,1056 ----
>   	{
>   	  /* 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",
> *************** load_line (FILE *input, char **pbuf, int
> *** 1067,1091 ****
>         if (c == '\0')
>   	continue;
>   
> -       /* 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'))
> --- 1067,1083 ----
>         if (c == '\0')
>   	continue;
>   
>         if (c == '&')
> ! 	{
> ! 	  if (seen_ampersand)
> ! 	    seen_ampersand = 0;
>   	  else
> ! 	    seen_ampersand = 1;
>   	}
>   
> +       if ((c != '&' && c != '!') || (c == '!' && !seen_ampersand))
> + 	seen_printable = 1;
> + 
>         /* Is this a fixed-form comment?  */
>         if (gfc_current_form == FORM_FIXED && i == 0
>   	  && (c == '*' || c == 'c' || c == 'd'))
> 
> 
> ------------------------------------------------------------------------
> 
> ! { dg-do run }
> ! PR31495 Is this continuation legal? 
> program print_ascertain
> character (len=50) :: str
> str = "hello world &
> &    &
> &!"
> if (str.ne."hello world     !") call abort
> end program print_ascertain



More information about the Gcc-patches mailing list