diff options
author | mikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-29 11:22:40 +0000 |
---|---|---|
committer | mikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-29 11:22:40 +0000 |
commit | b72a7318b78b5b77dfb94bba267b9dad42153586 (patch) | |
tree | 28bc068661ccb39824bcc78dcd3c40443158bb52 /gcc/fortran/class.c | |
parent | cb58739352379082da7ed1f128c15e8ef4ed42a7 (diff) | |
download | gcc-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.c | 22 |
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; } |