aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2010-11-08 23:42:34 +0100
committerJanus Weil <janus@gcc.gnu.org>2010-11-08 23:42:34 +0100
commit17643884ea02d28b11e1c84e7e78cfd8302600ad (patch)
tree321bd64dd347da6d0330cf968b008ada1ae036aa /gcc
parentd36dba07390dd63b6ac1a8b531cc6864605c56eb (diff)
downloadgcc-17643884ea02d28b11e1c84e7e78cfd8302600ad.zip
gcc-17643884ea02d28b11e1c84e7e78cfd8302600ad.tar.gz
gcc-17643884ea02d28b11e1c84e7e78cfd8302600ad.tar.bz2
re PR fortran/46344 ([OOP] ICE with allocatable CLASS components)
2010-11-08 Janus Weil <janus@gcc.gnu.org> PR fortran/46344 * decl.c (build_struct): Build vtab immediately if derived type has already been declared. 2010-11-08 Janus Weil <janus@gcc.gnu.org> PR fortran/46344 * gfortran.dg/class_28.f03: Extended. From-SVN: r166458
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/class_28.f0317
4 files changed, 34 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a513933..86aad78 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,6 +1,12 @@
2010-11-08 Janus Weil <janus@gcc.gnu.org>
PR fortran/46344
+ * decl.c (build_struct): Build vtab immediately if derived type
+ has already been declared.
+
+2010-11-08 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/46344
* trans-types.c (gfc_copy_dt_decls_ifequal): Handle CLASS components.
2010-11-06 Janus Weil <janus@gcc.gnu.org>
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 14575de..7fdfc99 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 c9be34d..4c348ba 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-08 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/46344
+ * gfortran.dg/class_28.f03: Extended.
+
2010-11-08 Nicola Pero <nicola.pero@meta-innovation.com>
* 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 cfd46a8..684b8cd 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" } }