diff options
author | Steven Bosscher <steven@gcc.gnu.org> | 2014-12-15 18:37:59 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-12-15 19:37:59 +0100 |
commit | d5e2274d7996cf8272a6c23152b347e8692d61f3 (patch) | |
tree | 459a209d2169e7738ed70e98e823893506c1f517 | |
parent | 76be46db72595b894a6e6da15e892d4a1f8f91cf (diff) | |
download | gcc-d5e2274d7996cf8272a6c23152b347e8692d61f3.zip gcc-d5e2274d7996cf8272a6c23152b347e8692d61f3.tar.gz gcc-d5e2274d7996cf8272a6c23152b347e8692d61f3.tar.bz2 |
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
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 14 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 3 | ||||
-rw-r--r-- | gcc/fortran/parse.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr61669.f90 | 7 |
6 files changed, 42 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0335824..83f2aba 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 1c64873..28a7aca 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -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 *); diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 42ed8eb..e0e5838 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -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? */ diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index ad3137b..54c0cdc 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -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 (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index af88c0a..77bd81b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gfortran.dg/pr61669.f90 b/gcc/testsuite/gfortran.dg/pr61669.f90 new file mode 100644 index 0000000..5bceafd --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr61669.f90 @@ -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 |