re PR fortran/34872 (Spurious error in snapshot of 01/18/08: Statement at (1) is not a valid branch target statement for the branch statement at (2))

2008-01-24  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/34872
	* parse.c (next_statement) : If ST_GET_FCN_CHARACTERISTICS  is
	seen, check for a statement label and, if present, delete it
	and set the locus to the start of the statement.

2008-01-24  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/34872
	* gfortran.dg/function_charlen_3.f: New test.

From-SVN: r131777
This commit is contained in:
Paul Thomas 2008-01-24 08:40:38 +00:00
parent d82b58c2ac
commit ae18bd76ae
4 changed files with 40 additions and 1 deletions

View file

@ -1,3 +1,10 @@
2008-01-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34872
* parse.c (next_statement) : If ST_GET_FCN_CHARACTERISTICS is
seen, check for a statement label and, if present, delete it
and set the locus to the start of the statement.
2008-01-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34875

View file

@ -795,7 +795,7 @@ static gfc_statement
next_statement (void)
{
gfc_statement st;
locus old_locus;
gfc_new_block = NULL;
for (;;)
@ -824,6 +824,8 @@ next_statement (void)
if (gfc_define_undef_line ())
continue;
old_locus = gfc_current_locus;
st = (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free ();
if (st != ST_NONE)
@ -832,6 +834,13 @@ next_statement (void)
gfc_buffer_error (0);
if (st == ST_GET_FCN_CHARACTERISTICS && gfc_statement_label != NULL)
{
gfc_free_st_label (gfc_statement_label);
gfc_statement_label = NULL;
gfc_current_locus = old_locus;
}
if (st != ST_NONE)
check_statement_label (st);

View file

@ -1,3 +1,8 @@
2008-01-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34872
* gfortran.dg/function_charlen_3.f: New test.
2008-01-23 Michael Matz <matz@suse.de>
PR debug/34895

View file

@ -0,0 +1,18 @@
C { dg-do compile }
C Tests the fix for the regression PR34872, in which the re-matching of
C the function declaration made a mess if the first executable statement
C had a label.
CHARACTER FUNCTION s()
10 CONTINUE
GOTO 10
s = ' '
END FUNCTION s
CHARACTER FUNCTION t()
10 format ("q")
write (t, 10)
END FUNCTION t
character t
if (t() .ne. "q") call abort ()
end