Commit 603cf12f by Tobias Burnus Committed by Tobias Burnus

re PR fortran/54426 (FAIL: gfortran.dg/common_6.f90 -O (internal compiler…

re PR fortran/54426 (FAIL: gfortran.dg/common_6.f90  -O  (internal compiler error) on powerpc-apple-darwin9)

2012-09-02  Tobias Burnus  <burnus@net-b.de>

        PR fortran/54426
        * symbol.c (find_common_symtree): New function.
        (gfc_undo_symbols): Use it; free common_head if needed.

From-SVN: r190853
parent 155b46f5
2012-09-02 Tobias Burnus <burnus@net-b.de>
PR fortran/54426
* symbol.c (find_common_symtree): New function.
(gfc_undo_symbols): Use it; free common_head if needed.
2012-08-28 Tobias Burnus <burnus@net-b.de> 2012-08-28 Tobias Burnus <burnus@net-b.de>
PR fortran/54389 PR fortran/54389
......
...@@ -2867,6 +2867,30 @@ gfc_get_ha_symbol (const char *name, gfc_symbol **result) ...@@ -2867,6 +2867,30 @@ gfc_get_ha_symbol (const char *name, gfc_symbol **result)
return i; return i;
} }
/* Search for the symtree belonging to a gfc_common_head; we cannot use
head->name as the common_root symtree's name might be mangled. */
static gfc_symtree *
find_common_symtree (gfc_symtree *st, gfc_common_head *head)
{
gfc_symtree *result;
if (st == NULL)
return NULL;
if (st->n.common == head)
return st;
result = find_common_symtree (st->left, head);
if (!result)
result = find_common_symtree (st->right, head);
return result;
}
/* Undoes all the changes made to symbols in the current statement. /* Undoes all the changes made to symbols in the current statement.
This subroutine is made simpler due to the fact that attributes are This subroutine is made simpler due to the fact that attributes are
never removed once added. */ never removed once added. */
...@@ -2890,6 +2914,17 @@ gfc_undo_symbols (void) ...@@ -2890,6 +2914,17 @@ gfc_undo_symbols (void)
needs to be removed to stop the resolver looking needs to be removed to stop the resolver looking
for a (possibly) dead symbol. */ for a (possibly) dead symbol. */
if (p->common_block->head == p && !p->common_next)
{
gfc_symtree st, *st0;
st0 = find_common_symtree (p->ns->common_root,
p->common_block);
st.name = st0->name;
gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
free (st0);
}
if (p->common_block->head == p) if (p->common_block->head == p)
p->common_block->head = p->common_next; p->common_block->head = p->common_next;
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment