diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2010-07-29 11:22:40 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2010-07-29 11:22:40 +0000 |
commit | 81fb8a483c2c59c5c301f1c0e48deb849ed2aeb0 (patch) | |
tree | 28bc068661ccb39824bcc78dcd3c40443158bb52 /gcc/fortran/class.c | |
parent | 6befd6b053f32de162090b6ee6316c6ac5bcaef0 (diff) | |
download | gcc-81fb8a483c2c59c5c301f1c0e48deb849ed2aeb0.zip gcc-81fb8a483c2c59c5c301f1c0e48deb849ed2aeb0.tar.gz gcc-81fb8a483c2c59c5c301f1c0e48deb849ed2aeb0.tar.bz2 |
re PR fortran/42051 ([OOP] ICE on array-valued function with CLASS formal argument)
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.
From-SVN: r162674
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 b5e17f4..b3a558b 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; } |