aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2013-03-03 17:21:07 +0000
committerMikael Morin <mikael@gcc.gnu.org>2013-03-03 17:21:07 +0000
commit718e305d0f87d5478b3f9246c4e8cfb1d172dfc3 (patch)
tree201285fb373f7d395c832998ebe9b214142841b5 /gcc
parentdd355a42fd3808c3b61f5f4b6b4834f42a37349a (diff)
downloadgcc-718e305d0f87d5478b3f9246c4e8cfb1d172dfc3.zip
gcc-718e305d0f87d5478b3f9246c4e8cfb1d172dfc3.tar.gz
gcc-718e305d0f87d5478b3f9246c4e8cfb1d172dfc3.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/symbol.c111
2 files changed, 67 insertions, 53 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 52ebd92..b3a995b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,7 +1,12 @@
2013-03-03 Mikael Morin <mikael@gcc.gnu.org>
- * 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 <mikael@gcc.gnu.org>
+
+ * 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 1bf4c86..ce39b8c 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);