From: Daniel Franke Date: Thu, 24 Jan 2008 21:36:14 +0000 (-0500) Subject: re PR fortran/33375 (ICE (segfault) gfortran.dg/common_6.f90) X-Git-Tag: releases/gcc-4.3.0~418 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79f40de682c23a73b99efa0be50bfb2d13869f8f;p=thirdparty%2Fgcc.git 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 --- 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) {