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

Janus Weil janus@gcc.gnu.org
Mon Nov 25 09:54:00 GMT 2013


Hi Tobias,

>> 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.

ouch, sorry for missing that.

A new version is attached, and I have added one of your examples to
the test case.  Ok now?

Cheers,
Janus
-------------- next part --------------
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c	(revision 205304)
+++ gcc/fortran/interface.c	(working copy)
@@ -2426,6 +2426,24 @@ 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++)
+	    {
+	      if (!as->upper[i] || !as->lower[i]
+		  || as->upper[i]->expr_type != EXPR_CONSTANT
+		  || as->lower[i]->expr_type != EXPR_CONSTANT)
+		return 0;
+
+	      elements = elements
+			 * (mpz_get_si (as->upper[i]->value.integer)
+			    - mpz_get_si (as->lower[i]->value.integer) + 1L);
+	    }
+	}
     }
 
   if (substrlen)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: typebound_proc_30.f90
Type: text/x-fortran
Size: 643 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20131125/a2ce9c1a/attachment.bin>


More information about the Gcc-patches mailing list