From bd48f123900b0abd449d22ec51b7c6decd9c6983 Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Sun, 29 Aug 2010 23:29:38 +0200 Subject: [PATCH] re PR fortran/42769 ([OOP] ICE in resolve_typebound_procedure) 2010-08-29 Janus Weil 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 PR fortran/42769 * gfortran.dg/dynamic_dispatch_11.f03: New. From-SVN: r163631 --- gcc/fortran/ChangeLog | 9 ++++- gcc/fortran/resolve.c | 8 +++++ gcc/testsuite/ChangeLog | 7 +++- .../gfortran.dg/dynamic_dispatch_11.f03 | 35 +++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f03 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9dab6972e306..c91663f5696d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,10 +1,17 @@ +2010-08-29 Janus Weil + + 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 PR fortran/45439 * match.c (gfc_match_select_type): Give the associate-name the FL_VARIABLE attribute. -2010-07-28 Steven G. Kargl +2010-08-28 Steven G. Kargl * simplify.c (gfc_simplify_bessel_n2): Fix indention and argument type. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 68faf8be815d..b9fea23e53fb 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 3ef4c0e22444..fe9f0240bde5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-29 Janus Weil + + PR fortran/42769 + * gfortran.dg/dynamic_dispatch_11.f03: New. + 2010-08-29 Jason Merrill PR c++/44991 @@ -8,7 +13,7 @@ PR fortran/45439 * gfortran.dg/select_type_16.f03: New. -2010-07-28 Steven G. Kargl +2010-08-28 Steven G. Kargl Tobias Burnus * 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 000000000000..e4abcb2846eb --- /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 + + +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" } } -- 2.47.2