Hi all,

here is a straightforward patch to teach 'get_expr_storage_size' about
type-bound procedures (which are handled internally as
procedure-pointer components of the corresponding vtab). In that sense
the patch should handle both TBPs as well as PPCs.

Regtested on x86_64-unknown-linux-gnu. Ok for trunk?

Cheers,
Janus



2013-11-18  Janus Weil  <ja...@gcc.gnu.org>

    PR fortran/59143
    * interface.c (get_expr_storage_size): Handle array-valued type-bound
    procedures.

2013-11-18  Janus Weil  <ja...@gcc.gnu.org>

    PR fortran/59143
    * gfortran.dg/typebound_proc_30.f90: New.
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c     (revision 204897)
+++ gcc/fortran/interface.c     (working copy)
@@ -2426,6 +2426,17 @@ get_expr_storage_size (gfc_expr *e)
                        - mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
            }
         }
+      else if (ref->type == REF_COMPONENT && ref->u.c.component->attr.function
+              && ref->u.c.component->attr.proc_pointer
+              && ref->u.c.component->attr.dimension)
+       {
+         /* Array-valued procedure-pointer components.  */
+         gfc_array_spec *as = ref->u.c.component->as;
+         for (i = 0; i < as->rank; i++)
+           elements = elements
+                     * (mpz_get_si (as->upper[i]->value.integer)
+                         - mpz_get_si (as->lower[i]->value.integer) + 1L);
+       }
     }
 
   if (substrlen)
! { dg-do compile }
!
! PR 59143: [OOP] Bogus warning with array-valued type-bound procedure
!
! Contributed by Jürgen Reuter <juergen.reu...@desy.de>

module phs_single

  type :: phs_single_t
   contains
     procedure, nopass :: decay_p 
  end type
  
contains

  subroutine evaluate (phs)
    class(phs_single_t) :: phs
    call func1 (phs%decay_p ())
  end subroutine

  subroutine func1 (p)
    real :: p(2)
  end subroutine
  
  function decay_p ()
    real :: decay_p(2)
    decay_p = 1.
  end function

end module

! { dg-final { cleanup-modules "phs_single" } }

Reply via email to