aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/symbol.c
diff options
context:
space:
mode:
authorBud Davis <jmdavis@link.com>2015-08-08 10:40:06 +0000
committerMikael Morin <mikael@gcc.gnu.org>2015-08-08 10:40:06 +0000
commit0d251765bed679b14b4f9f2d5ade7870b7b9d7c5 (patch)
treec8bd13a546047aec236cde7a6d75dd3216d8a6a3 /gcc/fortran/symbol.c
parent1aeec6dc1f26657cc32ed107b3de255566fcca41 (diff)
downloadgcc-0d251765bed679b14b4f9f2d5ade7870b7b9d7c5.zip
gcc-0d251765bed679b14b4f9f2d5ade7870b7b9d7c5.tar.gz
gcc-0d251765bed679b14b4f9f2d5ade7870b7b9d7c5.tar.bz2
When undoing symbols, also restore common block lists
gcc/fortran/ 2015-08-08 Bud Davis <jmdavis@link.com> Mikael Morin <mikael@gcc.gnu.org> PR fortran/59746 * symbol.c (gfc_restore_last_undo_checkpoint): Delete a common block symbol if it was put in the list. gcc/testsuite/ 2015-08-08 Bud Davis <jmdavis@link.com> PR fortran/59746 * gfortran.dg/common_22.f90: New. Co-Authored-By: Mikael Morin <mikael@gcc.gnu.org> From-SVN: r226732
Diffstat (limited to 'gcc/fortran/symbol.c')
-rw-r--r--gcc/fortran/symbol.c68
1 files changed, 34 insertions, 34 deletions
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 52c5234..0f33608 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -3168,49 +3168,49 @@ gfc_restore_last_undo_checkpoint (void)
FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
{
- if (p->gfc_new)
+ /* Symbol was new. Or was old and just put in common */
+ if ((p->gfc_new
+ || (p->attr.in_common && !p->old_symbol->attr.in_common ))
+ && p->attr.in_common && p->common_block && p->common_block->head)
{
- /* Symbol was new. */
- if (p->attr.in_common && p->common_block && 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 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_next)
+ if (p->common_block->head == p && !p->common_next)
+ {
+ gfc_symtree st, *st0;
+ st0 = find_common_symtree (p->ns->common_root,
+ p->common_block);
+ if (st0)
{
- gfc_symtree st, *st0;
- st0 = find_common_symtree (p->ns->common_root,
- p->common_block);
- if (st0)
- {
- st.name = st0->name;
- gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
- free (st0);
- }
+ st.name = st0->name;
+ gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
+ free (st0);
}
+ }
- 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;
- }
+ if (p->common_block->head == p)
+ p->common_block->head = p->common_next;
+ else
+ {
+ gfc_symbol *cparent, *csym;
- gcc_assert(cparent->common_next == p);
+ cparent = p->common_block->head;
+ csym = cparent->common_next;
- cparent->common_next = csym->common_next;
+ while (csym != p)
+ {
+ cparent = csym;
+ csym = csym->common_next;
}
- }
+ gcc_assert(cparent->common_next == p);
+ cparent->common_next = csym->common_next;
+ }
+ }
+ if (p->gfc_new)
+ {
/* The derived type is saved in the symtree with the first
letter capitalized; the all lower-case version to the
derived type contains its associated generic function. */