re PR fortran/61669 (Error recovery ICE)

PR fortran/61669
	* gfortran.h (struct gfc_namespace): Add OLD_DATA field.
	* decl.c (gfc_reject_data): New function.
	* parse.c *use_modules): Record roll-back point.
	(next_statement): Likewise.
	(reject_statement): Roll back to last accepted DATA.

	* gfortran.dg/pr61669.f90: New test.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>

From-SVN: r218757
This commit is contained in:
Steven Bosscher 2014-12-15 18:37:59 +00:00 committed by Jakub Jelinek
parent 76be46db72
commit d5e2274d79
6 changed files with 42 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2014-12-15 Steven Bosscher <steven@gcc.gnu.org>
PR fortran/61669
* gfortran.h (struct gfc_namespace): Add OLD_DATA field.
* decl.c (gfc_reject_data): New function.
* parse.c *use_modules): Record roll-back point.
(next_statement): Likewise.
(reject_statement): Roll back to last accepted DATA.
2014-12-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/63727

View File

@ -178,6 +178,20 @@ gfc_free_data_all (gfc_namespace *ns)
}
}
/* Reject data parsed since the last restore point was marked. */
void
gfc_reject_data (gfc_namespace *ns)
{
gfc_data *d;
while (ns->data && ns->data != ns->old_data)
{
d = ns->data->next;
free (ns->data);
ns->data = d;
}
}
static match var_element (gfc_data_variable *);

View File

@ -1627,7 +1627,7 @@ typedef struct gfc_namespace
gfc_st_label *st_labels;
/* This list holds information about all the data initializers in
this namespace. */
struct gfc_data *data;
struct gfc_data *data, *old_data;
gfc_charlen *cl_list, *old_cl_list;
@ -2929,6 +2929,7 @@ void gfc_free_omp_namelist (gfc_omp_namelist *);
void gfc_free_equiv (gfc_equiv *);
void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *);
void gfc_free_data (gfc_data *);
void gfc_reject_data (gfc_namespace *);
void gfc_free_case_list (gfc_case *);
/* matchexp.c -- FIXME too? */

View File

@ -119,6 +119,7 @@ use_modules (void)
gfc_warning_check ();
gfc_current_ns->old_cl_list = gfc_current_ns->cl_list;
gfc_current_ns->old_equiv = gfc_current_ns->equiv;
gfc_current_ns->old_data = gfc_current_ns->data;
last_was_use_stmt = false;
}
@ -1098,6 +1099,7 @@ next_statement (void)
gfc_current_ns->old_cl_list = gfc_current_ns->cl_list;
gfc_current_ns->old_equiv = gfc_current_ns->equiv;
gfc_current_ns->old_data = gfc_current_ns->data;
for (;;)
{
gfc_statement_label = NULL;
@ -2043,6 +2045,8 @@ reject_statement (void)
gfc_free_equiv_until (gfc_current_ns->equiv, gfc_current_ns->old_equiv);
gfc_current_ns->equiv = gfc_current_ns->old_equiv;
gfc_reject_data (gfc_current_ns);
gfc_new_block = NULL;
gfc_undo_symbols ();
gfc_clear_warning ();

View File

@ -1,3 +1,9 @@
2014-12-15 Steven Bosscher <steven@gcc.gnu.org>
Jakub Jelinek <jakub@redhat.com>
PR fortran/61669
* gfortran.dg/pr61669.f90: New test.
2014-12-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/64312

View File

@ -0,0 +1,7 @@
! { dg-do compile }
write (*,"(a)") char(12)
CHARACTER*80 A /"A"/ ! { dg-error "Unexpected data declaration statement" }
REAL*4 B ! { dg-error "Unexpected data declaration statement" }
write (*,"(a)") char(12)
DATA B / 0.02 / ! { dg-warning "Obsolescent feature: DATA statement" }
END