aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2010-05-22 20:55:53 +0200
committerJanus Weil <janus@gcc.gnu.org>2010-05-22 20:55:53 +0200
commitbc382218cee3c9536da0fbdf3ee61e4b93edb02b (patch)
tree83fbfbe19ac02ba3e65af83b1d91ce86bc69643e /gcc/fortran/resolve.c
parent09c58f303c581409342f0dfe304192216fe1830b (diff)
downloadgcc-bc382218cee3c9536da0fbdf3ee61e4b93edb02b.zip
gcc-bc382218cee3c9536da0fbdf3ee61e4b93edb02b.tar.gz
gcc-bc382218cee3c9536da0fbdf3ee61e4b93edb02b.tar.bz2
re PR fortran/44212 ([OOP] ICE when defining a pointer component before defining the class and calling a TBP then)
2010-05-22 Janus Weil <janus@gcc.gnu.org> PR fortran/44212 * match.c (gfc_match_select_type): On error jump back out of the local namespace. * parse.c (parse_derived): Defer creation of vtab symbols to resolution stage, more precisely to ... * resolve.c (resolve_fl_derived): ... this place. 2010-05-22 Janus Weil <janus@gcc.gnu.org> PR fortran/44212 * gfortran.dg/class_22.f03: New. From-SVN: r159745
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index f08e198..1f4c236 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -10577,6 +10577,22 @@ resolve_fl_derived (gfc_symbol *sym)
int i;
super_type = gfc_get_derived_super_type (sym);
+
+ if (sym->attr.is_class && sym->ts.u.derived == NULL)
+ {
+ /* Fix up incomplete CLASS symbols. */
+ gfc_component *data;
+ gfc_component *vptr;
+ gfc_symbol *vtab;
+ data = gfc_find_component (sym, "$data", true, true);
+ vptr = gfc_find_component (sym, "$vptr", true, true);
+ if (vptr->ts.u.derived == NULL)
+ {
+ vtab = gfc_find_derived_vtab (data->ts.u.derived, false);
+ gcc_assert (vtab);
+ vptr->ts.u.derived = vtab->ts.u.derived;
+ }
+ }
/* F2008, C432. */
if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp)