From 718e305d0f87d5478b3f9246c4e8cfb1d172dfc3 Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Sun, 3 Mar 2013 17:21:07 +0000 Subject: [PATCH] symbol.c (gfc_undo_symbols): Move code... fortran/ * symbol.c (gfc_undo_symbols): Move code... (restore_old_symbol): ... here as a new function. From-SVN: r196412 --- gcc/fortran/ChangeLog | 9 +++- gcc/fortran/symbol.c | 111 +++++++++++++++++++++++------------------- 2 files changed, 67 insertions(+), 53 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 52ebd923420..b3a995b3de2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,7 +1,12 @@ 2013-03-03 Mikael Morin - * Make-lang.in (F95_PARSER_OBJS): Add dependency to vec.h - * gfortran.h: Include vec.h + * symbol.c (gfc_undo_symbols): Move code... + (restore_old_symbol): ... here as a new function. + +2013-03-03 Mikael Morin + + * Make-lang.in (F95_PARSER_OBJS): Add dependency to vec.h. + * gfortran.h: Include vec.h. (gfc_undo_change_set): New struct. * symbol.c (tentative_tbp): Remove struct. (changed_syms, tentative_tbp_list): Remove variables. diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 1bf4c86e1f1..ce39b8cf427 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -2879,6 +2879,64 @@ find_common_symtree (gfc_symtree *st, gfc_common_head *head) } +/* Restore previous state of symbol. Just copy simple stuff. */ + +static void +restore_old_symbol (gfc_symbol *p) +{ + gfc_symbol *old; + + p->mark = 0; + old = p->old_symbol; + + p->ts.type = old->ts.type; + p->ts.kind = old->ts.kind; + + p->attr = old->attr; + + if (p->value != old->value) + { + gfc_free_expr (old->value); + p->value = NULL; + } + + if (p->as != old->as) + { + if (p->as) + gfc_free_array_spec (p->as); + p->as = old->as; + } + + p->generic = old->generic; + p->component_access = old->component_access; + + if (p->namelist != NULL && old->namelist == NULL) + { + gfc_free_namelist (p->namelist); + p->namelist = NULL; + } + else + { + if (p->namelist_tail != old->namelist_tail) + { + gfc_free_namelist (old->namelist_tail->next); + old->namelist_tail->next = NULL; + } + } + + p->namelist_tail = old->namelist_tail; + + if (p->formal != old->formal) + { + gfc_free_formal_arglist (p->formal); + p->formal = old->formal; + } + + free (p->old_symbol); + p->old_symbol = NULL; +} + + /* Undoes all the changes made to symbols in the current statement. This subroutine is made simpler due to the fact that attributes are never removed once added. */ @@ -2886,7 +2944,7 @@ find_common_symtree (gfc_symtree *st, gfc_common_head *head) void gfc_undo_symbols (void) { - gfc_symbol *p, *old; + gfc_symbol *p; unsigned i; FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p) @@ -2945,58 +3003,9 @@ gfc_undo_symbols (void) gfc_delete_symtree (&p->ns->sym_root, p->name); gfc_release_symbol (p); - continue; - } - - /* Restore previous state of symbol. Just copy simple stuff. */ - p->mark = 0; - old = p->old_symbol; - - p->ts.type = old->ts.type; - p->ts.kind = old->ts.kind; - - p->attr = old->attr; - - if (p->value != old->value) - { - gfc_free_expr (old->value); - p->value = NULL; - } - - if (p->as != old->as) - { - if (p->as) - gfc_free_array_spec (p->as); - p->as = old->as; - } - - p->generic = old->generic; - p->component_access = old->component_access; - - if (p->namelist != NULL && old->namelist == NULL) - { - gfc_free_namelist (p->namelist); - p->namelist = NULL; } else - { - if (p->namelist_tail != old->namelist_tail) - { - gfc_free_namelist (old->namelist_tail->next); - old->namelist_tail->next = NULL; - } - } - - p->namelist_tail = old->namelist_tail; - - if (p->formal != old->formal) - { - gfc_free_formal_arglist (p->formal); - p->formal = old->formal; - } - - free (p->old_symbol); - p->old_symbol = NULL; + restore_old_symbol (p); } latest_undo_chgset->syms.truncate (0);