From: Janus Weil Date: Mon, 8 Nov 2010 22:42:34 +0000 (+0100) Subject: re PR fortran/46344 ([OOP] ICE with allocatable CLASS components) X-Git-Tag: releases/gcc-4.6.0~2815 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=17643884ea02d28b11e1c84e7e78cfd8302600ad;p=thirdparty%2Fgcc.git re PR fortran/46344 ([OOP] ICE with allocatable CLASS components) 2010-11-08 Janus Weil PR fortran/46344 * decl.c (build_struct): Build vtab immediately if derived type has already been declared. 2010-11-08 Janus Weil PR fortran/46344 * gfortran.dg/class_28.f03: Extended. From-SVN: r166458 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a513933c5a10..86aad78e29ce 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2010-11-08 Janus Weil + + PR fortran/46344 + * decl.c (build_struct): Build vtab immediately if derived type + has already been declared. + 2010-11-08 Janus Weil PR fortran/46344 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 14575dec8987..7fdfc99a6464 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1629,7 +1629,13 @@ build_struct (const char *name, gfc_charlen *cl, gfc_expr **init, scalar: if (c->ts.type == BT_CLASS) - gfc_build_class_symbol (&c->ts, &c->attr, &c->as, true); + { + bool delayed = (gfc_state_stack->sym == c->ts.u.derived) + || (!c->ts.u.derived->components + && !c->ts.u.derived->attr.zero_comp); + gfc_build_class_symbol (&c->ts, &c->attr, &c->as, delayed); + } + return t; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c9be34d42f51..4c348babbc29 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-08 Janus Weil + + PR fortran/46344 + * gfortran.dg/class_28.f03: Extended. + 2010-11-08 Nicola Pero * objc.dg/property/dotsyntax-13.m: New. diff --git a/gcc/testsuite/gfortran.dg/class_28.f03 b/gcc/testsuite/gfortran.dg/class_28.f03 index cfd46a8eb656..684b8cdab766 100644 --- a/gcc/testsuite/gfortran.dg/class_28.f03 +++ b/gcc/testsuite/gfortran.dg/class_28.f03 @@ -17,6 +17,21 @@ module m end module m + +module m2 + + type t1 + end type + + type t2 + class(t1), allocatable :: c + end type + + type(t1) :: w + +end module m2 + + program p use m implicit none @@ -27,4 +42,4 @@ program p end program p -! { dg-final { cleanup-modules "m" } } +! { dg-final { cleanup-modules "m m2" } }