diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2008-01-24 16:36:14 -0500 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2008-01-24 16:36:14 -0500 |
commit | 79f40de682c23a73b99efa0be50bfb2d13869f8f (patch) | |
tree | 002aa4e5c6d655e2dca2be8b456e05e85aacd7c1 | |
parent | 7c8d27031551bc95dd08a0a22d78da2f15c9b528 (diff) | |
download | gcc-79f40de682c23a73b99efa0be50bfb2d13869f8f.zip gcc-79f40de682c23a73b99efa0be50bfb2d13869f8f.tar.gz gcc-79f40de682c23a73b99efa0be50bfb2d13869f8f.tar.bz2 |
re PR fortran/33375 (ICE (segfault) gfortran.dg/common_6.f90)
2008-01-24 Daniel Franke <franke.daniel@gmail.com>
PR fortran/33375
PR fortran/34858
* gfortran.h: Revert changes from 2008-01-17.
* match.c: Likewise.
* symbol.c: Likewise.
(gfc_undo_symbols): Undo namespace changes related to common blocks.
From-SVN: r131811
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 1 | ||||
-rw-r--r-- | gcc/fortran/match.c | 2 | ||||
-rw-r--r-- | gcc/fortran/symbol.c | 37 |
4 files changed, 41 insertions, 8 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c9cdfde..8d705f8 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,14 @@ 2008-01-24 Daniel Franke <franke.daniel@gmail.com> + PR fortran/33375 + PR fortran/34858 + * gfortran.h: Revert changes from 2008-01-17. + * match.c: Likewise. + * symbol.c: Likewise. + (gfc_undo_symbols): Undo namespace changes related to common blocks. + +2008-01-24 Daniel Franke <franke.daniel@gmail.com> + PR fortran/34202 * data.c (formalize_structure_cons): Skip formalization on empty structures. diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index d5f0073..aac1f82 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -2137,7 +2137,6 @@ int gfc_symbols_could_alias (gfc_symbol *, gfc_symbol *); void gfc_undo_symbols (void); void gfc_commit_symbols (void); void gfc_commit_symbol (gfc_symbol *); -void gfc_free_common_tree (gfc_symtree *); void gfc_free_namespace (gfc_namespace *); void gfc_symbol_init_2 (void); diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index f21748c..ad636f9 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -2951,8 +2951,6 @@ done: return MATCH_YES; syntax: - gfc_free_common_tree (gfc_current_ns->common_root); - gfc_current_ns->common_root = NULL; gfc_syntax_error (ST_COMMON); cleanup: diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index a50ed26..a802fa1 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -2582,6 +2582,33 @@ gfc_undo_symbols (void) if (p->new) { /* Symbol was new. */ + if (p->attr.in_common && p->common_block->head) + { + /* If the symbol was added to any common block, it + needs to be removed to stop the resolver looking + for a (possibly) dead symbol. */ + + if (p->common_block->head == p) + p->common_block->head = p->common_next; + else + { + gfc_symbol *cparent, *csym; + + cparent = p->common_block->head; + csym = cparent->common_next; + + while (csym != p) + { + cparent = csym; + csym = csym->common_next; + } + + gcc_assert(cparent->common_next == p); + + cparent->common_next = csym->common_next; + } + } + delete_symtree (&p->ns->sym_root, p->name); p->refs--; @@ -2726,14 +2753,14 @@ gfc_commit_symbol (gfc_symbol *sym) /* Recursive function that deletes an entire tree and all the common head structures it points to. */ -void -gfc_free_common_tree (gfc_symtree * common_tree) +static void +free_common_tree (gfc_symtree * common_tree) { if (common_tree == NULL) return; - gfc_free_common_tree (common_tree->left); - gfc_free_common_tree (common_tree->right); + free_common_tree (common_tree->left); + free_common_tree (common_tree->right); gfc_free (common_tree); } @@ -2863,7 +2890,7 @@ gfc_free_namespace (gfc_namespace *ns) free_sym_tree (ns->sym_root); free_uop_tree (ns->uop_root); - gfc_free_common_tree (ns->common_root); + free_common_tree (ns->common_root); for (cl = ns->cl_list; cl; cl = cl2) { |