aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2010-08-29 23:29:38 +0200
committerJanus Weil <janus@gcc.gnu.org>2010-08-29 23:29:38 +0200
commitbd48f123900b0abd449d22ec51b7c6decd9c6983 (patch)
tree9d85f2b8035f657e325734fda48182ef05b441ce /gcc
parent33620355cd432b0e3983d3740c5d64340e9fac93 (diff)
downloadgcc-bd48f123900b0abd449d22ec51b7c6decd9c6983.zip
gcc-bd48f123900b0abd449d22ec51b7c6decd9c6983.tar.gz
gcc-bd48f123900b0abd449d22ec51b7c6decd9c6983.tar.bz2
re PR fortran/42769 ([OOP] ICE in resolve_typebound_procedure)
2010-08-29 Janus Weil <janus@gcc.gnu.org> PR fortran/42769 * resolve.c (resolve_structure_cons): For derived types, make sure the type has been resolved. (resolve_typebound_procedures): Make sure the vtab has been generated. 2010-08-29 Janus Weil <janus@gcc.gnu.org> PR fortran/42769 * gfortran.dg/dynamic_dispatch_11.f03: New. From-SVN: r163631
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/resolve.c8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f0335
4 files changed, 57 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9dab697..c91663f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,10 +1,17 @@
2010-08-29 Janus Weil <janus@gcc.gnu.org>
+ PR fortran/42769
+ * resolve.c (resolve_structure_cons): For derived types, make sure the
+ type has been resolved.
+ (resolve_typebound_procedures): Make sure the vtab has been generated.
+
+2010-08-29 Janus Weil <janus@gcc.gnu.org>
+
PR fortran/45439
* match.c (gfc_match_select_type): Give the associate-name the
FL_VARIABLE attribute.
-2010-07-28 Steven G. Kargl <kargl@gcc.gnu.org>
+2010-08-28 Steven G. Kargl <kargl@gcc.gnu.org>
* simplify.c (gfc_simplify_bessel_n2): Fix indention
and argument type.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 68faf8b..b9fea23 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -930,6 +930,10 @@ resolve_structure_cons (gfc_expr *expr, int init)
symbol_attribute a;
t = SUCCESS;
+
+ if (expr->ts.type == BT_DERIVED)
+ resolve_symbol (expr->ts.u.derived);
+
cons = gfc_constructor_first (expr->value.constructor);
/* A constructor may have references if it is the result of substituting a
parameter variable. In this case we just pull out the component we
@@ -11039,6 +11043,7 @@ error:
stree->n.tb->error = 1;
}
+
static gfc_try
resolve_typebound_procedures (gfc_symbol* derived)
{
@@ -11050,6 +11055,9 @@ resolve_typebound_procedures (gfc_symbol* derived)
resolve_bindings_derived = derived;
resolve_bindings_result = SUCCESS;
+ /* Make sure the vtab has been generated. */
+ gfc_find_derived_vtab (derived);
+
if (derived->f2k_derived->tb_sym_root)
gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
&resolve_typebound_procedure);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3ef4c0e..fe9f024 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-08-29 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/42769
+ * gfortran.dg/dynamic_dispatch_11.f03: New.
+
2010-08-29 Jason Merrill <jason@redhat.com>
PR c++/44991
@@ -8,7 +13,7 @@
PR fortran/45439
* gfortran.dg/select_type_16.f03: New.
-2010-07-28 Steven G. Kargl <kargl@gcc.gnu.org>
+2010-08-28 Steven G. Kargl <kargl@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
* gfortran.dg/bessel_7.f90: Decrease required precision.
diff --git a/gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f03 b/gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f03
new file mode 100644
index 0000000..e4abcb2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f03
@@ -0,0 +1,35 @@
+! { dg-do run }
+!
+! PR 42769: [OOP] ICE in resolve_typebound_procedure
+! comment #27
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+
+module mod1
+ type :: t1
+ contains
+ procedure, nopass :: get => my_get
+ end type
+contains
+ integer function my_get()
+ my_get = 1
+ end function
+end module
+
+module mod2
+contains
+ integer function my_get() ! must have the same name as the function in mod1
+ my_get = 2
+ end function
+end module
+
+ use mod2
+ use mod1 ! order of use statements is important
+ class(t1),allocatable :: a
+ allocate(a)
+ if (a%get()/=1) call abort()
+end
+
+
+! { dg-final { cleanup-modules "mod1 mod2" } }