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" } }

Reply via email to