aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Franke <franke.daniel@gmail.com>2008-01-24 16:36:14 -0500
committerDaniel Franke <dfranke@gcc.gnu.org>2008-01-24 16:36:14 -0500
commit79f40de682c23a73b99efa0be50bfb2d13869f8f (patch)
tree002aa4e5c6d655e2dca2be8b456e05e85aacd7c1
parent7c8d27031551bc95dd08a0a22d78da2f15c9b528 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/fortran/gfortran.h1
-rw-r--r--gcc/fortran/match.c2
-rw-r--r--gcc/fortran/symbol.c37
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)
{