From 79f40de682c23a73b99efa0be50bfb2d13869f8f Mon Sep 17 00:00:00 2001 From: Daniel Franke Date: Thu, 24 Jan 2008 16:36:14 -0500 Subject: [PATCH] re PR fortran/33375 (ICE (segfault) gfortran.dg/common_6.f90) 2008-01-24 Daniel Franke 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 --- gcc/fortran/ChangeLog | 9 +++++++++ gcc/fortran/gfortran.h | 1 - gcc/fortran/match.c | 2 -- gcc/fortran/symbol.c | 37 ++++++++++++++++++++++++++++++++----- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c9cdfde362e3..8d705f8e97f9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2008-01-24 Daniel Franke + + 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 PR fortran/34202 diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index d5f00737d3db..aac1f821334c 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 f21748c1b9ae..ad636f93f3d6 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 a50ed261141c..a802fa16dc8c 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) { -- 2.47.2