summaryrefslogtreecommitdiff
path: root/gcc/fortran/class.c
diff options
context:
space:
mode:
authormikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-29 11:22:40 +0000
committermikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-29 11:22:40 +0000
commitb72a7318b78b5b77dfb94bba267b9dad42153586 (patch)
tree28bc068661ccb39824bcc78dcd3c40443158bb52 /gcc/fortran/class.c
parentcb58739352379082da7ed1f128c15e8ef4ed42a7 (diff)
downloadgcc-b72a7318b78b5b77dfb94bba267b9dad42153586.tar.gz
2010-07-29 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/42051 PR fortran/44064 * class.c (gfc_find_derived_vtab): Accept or discard newly created symbols before returning. 2010-07-29 Mikael Morin <mikael@gcc.gnu.org> PR fortran/42051 PR fortran/44064 * gfortran.dg/pr42051.f03: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162674 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r--gcc/fortran/class.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index b5e17f4e2f6..b3a558b5f9a 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -321,7 +321,7 @@ gfc_symbol *
gfc_find_derived_vtab (gfc_symbol *derived)
{
gfc_namespace *ns;
- gfc_symbol *vtab = NULL, *vtype = NULL;
+ gfc_symbol *vtab = NULL, *vtype = NULL, *found_sym = NULL;
char name[2 * GFC_MAX_SYMBOL_LEN + 8];
ns = gfc_current_ns;
@@ -356,13 +356,13 @@ gfc_find_derived_vtab (gfc_symbol *derived)
gfc_get_symbol (name, ns, &vtype);
if (gfc_add_flavor (&vtype->attr, FL_DERIVED,
NULL, &gfc_current_locus) == FAILURE)
- return NULL;
+ goto cleanup;
vtype->refs++;
gfc_set_sym_referenced (vtype);
/* Add component '$hash'. */
if (gfc_add_component (vtype, "$hash", &c) == FAILURE)
- return NULL;
+ goto cleanup;
c->ts.type = BT_INTEGER;
c->ts.kind = 4;
c->attr.access = ACCESS_PRIVATE;
@@ -371,7 +371,7 @@ gfc_find_derived_vtab (gfc_symbol *derived)
/* Add component '$size'. */
if (gfc_add_component (vtype, "$size", &c) == FAILURE)
- return NULL;
+ goto cleanup;
c->ts.type = BT_INTEGER;
c->ts.kind = 4;
c->attr.access = ACCESS_PRIVATE;
@@ -384,7 +384,7 @@ gfc_find_derived_vtab (gfc_symbol *derived)
/* Add component $extends. */
if (gfc_add_component (vtype, "$extends", &c) == FAILURE)
- return NULL;
+ goto cleanup;
c->attr.pointer = 1;
c->attr.access = ACCESS_PRIVATE;
parent = gfc_get_derived_super_type (derived);
@@ -414,7 +414,17 @@ gfc_find_derived_vtab (gfc_symbol *derived)
}
}
- return vtab;
+ found_sym = vtab;
+
+cleanup:
+ /* It is unexpected to have some symbols added at resolution or code
+ generation time. We commit the changes in order to keep a clean state. */
+ if (found_sym)
+ gfc_commit_symbols ();
+ else
+ gfc_undo_symbols ();
+
+ return found_sym;
}