diff options
author | Janus Weil <janus@gcc.gnu.org> | 2010-05-22 20:55:53 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2010-05-22 20:55:53 +0200 |
commit | bc382218cee3c9536da0fbdf3ee61e4b93edb02b (patch) | |
tree | 83fbfbe19ac02ba3e65af83b1d91ce86bc69643e /gcc/fortran/resolve.c | |
parent | 09c58f303c581409342f0dfe304192216fe1830b (diff) | |
download | gcc-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.c | 16 |
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) |