Hi all, the PR in the subject line involves a module procedure whose result has array bounds which contain a type-bound procedure call. Since the procedure interface is written to the .mod file, also the TBP expression needs to be written. This leads to an ICE, since it simply has not been implemented yet.
When writing a function reference, we now discriminate between three cases: (1) 'ordinary' procedures, (2) type-bound procedures and (3) intrinsic procedures. We first read/write an integer value to indicate which case we're dealing with, and then do the specific I/O for this case (see patch). Up to now we basically did the same already, but only including two cases (ordinary and intrinsic functions). The patch has been regtested on x86_64-unknown-linux-gnu. Ok for trunk? Should I also bump the MOD_VERSION? Cheers, Janus 2013-12-11 Janus Weil <ja...@gcc.gnu.org> PR fortran/59450 * module.c (mio_expr): Handle type-bound function expressions. 2013-12-11 Janus Weil <ja...@gcc.gnu.org> PR fortran/59450 * gfortran.dg/typebound_proc_31.f90: New.
Index: gcc/fortran/module.c =================================================================== --- gcc/fortran/module.c (revision 205857) +++ gcc/fortran/module.c (working copy) @@ -3358,12 +3358,24 @@ mio_expr (gfc_expr **ep) { e->value.function.name = mio_allocated_string (e->value.function.name); - flag = e->value.function.esym != NULL; + if (e->value.function.esym) + flag = 1; + else if (e->ref) + flag = 2; + else + flag = 0; mio_integer (&flag); - if (flag) - mio_symbol_ref (&e->value.function.esym); - else - write_atom (ATOM_STRING, e->value.function.isym->name); + switch (flag) + { + case 1: + mio_symbol_ref (&e->value.function.esym); + break; + case 2: + mio_ref_list (&e->ref); + break; + default: + write_atom (ATOM_STRING, e->value.function.isym->name); + } } else { @@ -3372,10 +3384,15 @@ mio_expr (gfc_expr **ep) free (atom_string); mio_integer (&flag); - if (flag) - mio_symbol_ref (&e->value.function.esym); - else + switch (flag) { + case 1: + mio_symbol_ref (&e->value.function.esym); + break; + case 2: + mio_ref_list (&e->ref); + break; + default: require_atom (ATOM_STRING); e->value.function.isym = gfc_find_function (atom_string); free (atom_string);
! { dg-do compile } ! ! PR 59450: [OOP] ICE for type-bound-procedure expression in module procedure interface ! ! Contributed by <b...@miller-mohr.de> module classes implicit none type :: base_class contains procedure, nopass :: get_num end type contains pure integer function get_num() end function function get_array( this ) result(array) class(base_class), intent(in) :: this integer, dimension( this%get_num() ) :: array end function end module ! { dg-final { cleanup-modules "classes" } }