[PATCH] PR fortran/77978 -- STOP code fixes

Jerry DeLisle jvdelisle@charter.net
Sat Oct 15 06:36:00 GMT 2016


On 10/14/2016 05:24 PM, Steve Kargl wrote:
> The attach patch fixes a number of shortcomings with
> STOP codes in gfortran.  The updated comment in the
> code nicely summarizes the problem.
>
>  /* Match a number or character constant after an (ERROR) STOP or PAUSE
> -   statement.  */
> +   statement.  The requirements for a stop-code differs in the standards.
> +
> +   Fortran 95 has
> +
> +   R840 stop-stmt  is STOP [ stop-code ]
> +   R841 stop-code  is scalar-char-constant
> +                   or digit [ digit [ digit [ digit [ digit ] ] ] ]
> +
> +   Fortran 2003 is the same as Fortran 95 except R840 and R841 are now
> +   R849 and R850.
> +
> +   Fortran 2008 has
> +
> +   R855 stop-stmt     is STOP [ stop-code ]
> +   R856 allstop-stmt  is ALL STOP [ stop-code ]
> +   R857 stop-code     is scalar-default-char-constant-expr
> +                      or scalar-int-constant-expr
> +*/
>
> So, the F95/2003 "digit [...]" is not a scalar-int-constant-expr.
> It sort of looks like a statement label, but of course it is not
> a statement label as the stop code does label anything.  Currently,
> gfortran parses "digit [...]" as an expression.  I've added the
> necessary checking that "digit [...]" is valid with one exception.
> For the code
>
>   program foo
>     stop merge(667, 668, .true.)
>   end
>
> gfortran with either -std=f95 or -std=f2003 should reject
> this code.  My patch does not fix this issue, because it
> would (1) require a complete rewrite of gfc_match_stopcode
> (which I am not willing to do) and (2) it simply is a vastly
> unimportant corner case that gives the desired behavior.
>
> A second issue raised by John in PR fortran/77978 is that
> for F95/2003, the following is valid free-form source code:
>
>   program foo
>     stop666
>   end
>
> but is invalid F2008.  The patch fixes this bug, too.
>
> OK to commit?
>

OK and thanks for fix.

Jerry



More information about the Fortran mailing list