diff mbox

[Fortran,OOP] PR 59143: Bogus warning with array-valued type-bound procedure

Message ID CAKwh3qiyeTOTTYgLAnkVP=qnvSRdVFgNQ8mXtwd9umyrNHLY6Q@mail.gmail.com
State New
Headers show

Commit Message

Janus Weil Nov. 18, 2013, 8:49 a.m. UTC
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  <janus@gcc.gnu.org>

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

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

    PR fortran/59143
    * gfortran.dg/typebound_proc_30.f90: New.

Comments

Janus Weil Nov. 24, 2013, 2:32 p.m. UTC | #1
ping!


2013/11/18 Janus Weil <janus@gcc.gnu.org>:
> 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  <janus@gcc.gnu.org>
>
>     PR fortran/59143
>     * interface.c (get_expr_storage_size): Handle array-valued type-bound
>     procedures.
>
> 2013-11-18  Janus Weil  <janus@gcc.gnu.org>
>
>     PR fortran/59143
>     * gfortran.dg/typebound_proc_30.f90: New.
Tobias Burnus Nov. 24, 2013, 3:35 p.m. UTC | #2
Janus Weil wrote:
> 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?

The patch is NOT okay:

> +      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);

You cannot assume that the function returns an explicit size array with 
constant bounds. The code simply breaks (ICE) if you use, e.g.,

     call func1 (phs%decay_p (2))
with
   function decay_p (n)
     real :: decay_p(n)
     decay_p = 1.
   end function

or for instance

   function decay_p (n)
     real, allocatable :: decay_p(:)
     decay_p = [1.]
   end function

Tobias
diff mbox

Patch

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)