public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch, Fortran] PR45859 - Permit array elements to coarray dummy arguments
@ 2015-12-04 12:39 Tobias Burnus
  2015-12-04 13:16 ` Tobias Burnus
  0 siblings, 1 reply; 4+ messages in thread
From: Tobias Burnus @ 2015-12-04 12:39 UTC (permalink / raw)
  To: gcc-patches, fortran

[-- Attachment #1: Type: text/plain, Size: 923 bytes --]

This patch permits

   interface
      subroutine sub (x)
         real x(10)[*]
      end subroutine
   end interface
   real :: x(100)[*]
   call sub (x(10))
   end

where one passes an array element ("x(10)") of a contiguous array to a
coarray dummy argument. That's permitted per interpretation request
F08/0048, which ended up in Fortran 2008's Corrigendum 2 - and is also
in the current Fortran 2015 drafts:

"If the dummy argument is an array coarray that has the CONTIGUOUS attribute
 or is not of assumed shape, the corresponding actual argument shall be
 simply contiguous or an element of a simply contiguous array."

the "or ..." of the last line was added in the corrigendum.


I hope and think that I got the true/false of the other users correct - in
most cases, it probably doesn't matter as the caller is only reached for
expr->rank > 0.

Build and regtested on x86-64-gnu-linux.
OK for the trunk?

Tobias

[-- Attachment #2: coarray.diff --]
[-- Type: text/x-diff, Size: 6163 bytes --]

gcc/fortran
	PR fortran/45859
	* expr.c (gfc_is_simply_contiguous): Optionally permit array elements.
	(gfc_check_pointer_assign): Update call.
	* interface.c (compare_parameter): Ditto.
	* trans-array.c (gfc_conv_array_parameter): Ditto.
	* trans-intrinsic.c (gfc_conv_intrinsic_transfer,
	conv_isocbinding_function): Ditto.
	* gfortran.h (gfc_is_simply_contiguous):

gcc/testsuite/
	PR fortran/45859
	* gfortran.dg/coarray_argument_1.f90: New.

diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 2aeb0b5..5dd90ef 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3683,7 +3683,7 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
 	 and F2008 must be allowed.  */
       if (rvalue->rank != 1)
 	{
-	  if (!gfc_is_simply_contiguous (rvalue, true))
+	  if (!gfc_is_simply_contiguous (rvalue, true, false))
 	    {
 	      gfc_error ("Rank remapping target must be rank 1 or"
 			 " simply contiguous at %L", &rvalue->where);
@@ -4601,7 +4601,7 @@ gfc_has_ultimate_pointer (gfc_expr *e)
    a "(::1)" is accepted.  */
 
 bool
-gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
+gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
 {
   bool colon;
   int i;
@@ -4615,7 +4615,7 @@ gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
   else if (expr->expr_type != EXPR_VARIABLE)
     return false;
 
-  if (expr->rank == 0)
+  if (!permit_element && expr->rank == 0)
     return false;
 
   for (ref = expr->ref; ref; ref = ref->next)
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 9f61e45..d203c32 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -2982,7 +2982,7 @@ void gfc_free_actual_arglist (gfc_actual_arglist *);
 gfc_actual_arglist *gfc_copy_actual_arglist (gfc_actual_arglist *);
 const char *gfc_extract_int (gfc_expr *, int *);
 bool is_subref_array (gfc_expr *);
-bool gfc_is_simply_contiguous (gfc_expr *, bool);
+bool gfc_is_simply_contiguous (gfc_expr *, bool, bool);
 bool gfc_check_init_expr (gfc_expr *);
 
 gfc_expr *gfc_build_conversion (gfc_expr *);
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index f74239d..bfd5d36 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -2020,7 +2020,7 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
 
   /* F2008, C1241.  */
   if (formal->attr.pointer && formal->attr.contiguous
-      && !gfc_is_simply_contiguous (actual, true))
+      && !gfc_is_simply_contiguous (actual, true, false))
     {
       if (where)
 	gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
@@ -2131,15 +2131,17 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
 
   if (formal->attr.codimension)
     {
-      /* F2008, 12.5.2.8.  */
+      /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048).  */
+      /* F2015, 12.5.2.8.  */
       if (formal->attr.dimension
 	  && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
 	  && gfc_expr_attr (actual).dimension
-	  && !gfc_is_simply_contiguous (actual, true))
+	  && !gfc_is_simply_contiguous (actual, true, true))
 	{
 	  if (where)
 	    gfc_error ("Actual argument to %qs at %L must be simply "
-		       "contiguous", formal->name, &actual->where);
+		       "contiguous or an element of such an array",
+		       formal->name, &actual->where);
 	  return 0;
 	}
 
@@ -2179,7 +2181,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
       && (actual->symtree->n.sym->attr.asynchronous
          || actual->symtree->n.sym->attr.volatile_)
       &&  (formal->attr.asynchronous || formal->attr.volatile_)
-      && actual->rank && formal->as && !gfc_is_simply_contiguous (actual, true)
+      && actual->rank && formal->as
+      && !gfc_is_simply_contiguous (actual, true, false)
       && ((formal->as->type != AS_ASSUMED_SHAPE
 	   && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
 	  || formal->attr.contiguous))
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 69f6e19..6e24e2e 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -7386,7 +7386,7 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
 		  && ref->u.ar.as->type != AS_ASSUMED_RANK
 		  && ref->u.ar.as->type != AS_ASSUMED_SHAPE)
 		      ||
-	     gfc_is_simply_contiguous (expr, false));
+	     gfc_is_simply_contiguous (expr, false, true));
 
   no_pack = contiguous && no_pack;
 
@@ -7464,7 +7464,7 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
     }
 
   if (g77 || (fsym && fsym->attr.contiguous
-	      && !gfc_is_simply_contiguous (expr, false)))
+	      && !gfc_is_simply_contiguous (expr, false, true)))
     {
       tree origptr = NULL_TREE;
 
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 21efe44..743148e 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -6244,7 +6244,7 @@ gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
       source_type = gfc_get_element_type (TREE_TYPE (argse.expr));
 
       /* Repack the source if not simply contiguous.  */
-      if (!gfc_is_simply_contiguous (arg->expr, false))
+      if (!gfc_is_simply_contiguous (arg->expr, false, true))
 	{
 	  tmp = gfc_build_addr_expr (NULL_TREE, argse.expr);
 
@@ -7142,7 +7142,7 @@ conv_isocbinding_function (gfc_se *se, gfc_expr *expr)
     {
       if (arg->expr->rank == 0)
 	gfc_conv_expr_reference (se, arg->expr);
-      else if (gfc_is_simply_contiguous (arg->expr, false))
+      else if (gfc_is_simply_contiguous (arg->expr, false, false))
 	gfc_conv_array_parameter (se, arg->expr, true, NULL, NULL, NULL);
       else
 	{
diff --git a/gcc/testsuite/gfortran.dg/coarray_argument_1.f90 b/gcc/testsuite/gfortran.dg/coarray_argument_1.f90
new file mode 100644
index 0000000..511da29
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_argument_1.f90
@@ -0,0 +1,14 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=lib" }
+!
+! PR fortran/45859
+! Interpretation request F08/0048
+!
+   interface
+      subroutine sub (x)
+         real x(10)[*]
+      end subroutine
+   end interface
+   real :: x(100)[*]
+   call sub (x(10))
+   end

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Patch, Fortran] PR45859 - Permit array elements to coarray dummy arguments
  2015-12-04 12:39 [Patch, Fortran] PR45859 - Permit array elements to coarray dummy arguments Tobias Burnus
@ 2015-12-04 13:16 ` Tobias Burnus
  2015-12-09  7:24   ` Tobias Burnus
  0 siblings, 1 reply; 4+ messages in thread
From: Tobias Burnus @ 2015-12-04 13:16 UTC (permalink / raw)
  To: gcc-patches, fortran

I pressed "Send" too early - as the testsuite fails unless the following
patch is applied. I think I will just use this test case (with patch)
instead of adding a new test-suite file. Required patch:

--- a/gcc/testsuite/gfortran.dg/coarray_args_2.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_args_2.f90
@@ -40,8 +40,7 @@ program rank_mismatch_02
   sync all

   call subr(ndim, a(1:1,2)) ! OK
-  call subr(ndim, a(1,2)) ! { dg-error "must be simply contiguous" }
-                          ! See also F08/0048 and PR 45859 about the validity
+  call subr(ndim, a(1,2)) ! See also F08/0048 and PR 45859 about the validity
   if (this_image() == 1) then
      write(*, *) 'OK'
   end if


Tobias

On Fri, Dec 04, 2015 at 01:39:22PM +0100, Tobias Burnus wrote:
> This patch permits
> 
>    interface
>       subroutine sub (x)
>          real x(10)[*]
>       end subroutine
>    end interface
>    real :: x(100)[*]
>    call sub (x(10))
>    end
> 
> where one passes an array element ("x(10)") of a contiguous array to a
> coarray dummy argument. That's permitted per interpretation request
> F08/0048, which ended up in Fortran 2008's Corrigendum 2 - and is also
> in the current Fortran 2015 drafts:
> 
> "If the dummy argument is an array coarray that has the CONTIGUOUS attribute
>  or is not of assumed shape, the corresponding actual argument shall be
>  simply contiguous or an element of a simply contiguous array."
> 
> the "or ..." of the last line was added in the corrigendum.
> 
> 
> I hope and think that I got the true/false of the other users correct - in
> most cases, it probably doesn't matter as the caller is only reached for
> expr->rank > 0.
> 
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?
> 
> Tobias

> gcc/fortran
> 	PR fortran/45859
> 	* expr.c (gfc_is_simply_contiguous): Optionally permit array elements.
> 	(gfc_check_pointer_assign): Update call.
> 	* interface.c (compare_parameter): Ditto.
> 	* trans-array.c (gfc_conv_array_parameter): Ditto.
> 	* trans-intrinsic.c (gfc_conv_intrinsic_transfer,
> 	conv_isocbinding_function): Ditto.
> 	* gfortran.h (gfc_is_simply_contiguous):
> 
> gcc/testsuite/
> 	PR fortran/45859
> 	* gfortran.dg/coarray_argument_1.f90: New.
> 
> diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
> index 2aeb0b5..5dd90ef 100644
> --- a/gcc/fortran/expr.c
> +++ b/gcc/fortran/expr.c
> @@ -3683,7 +3683,7 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
>  	 and F2008 must be allowed.  */
>        if (rvalue->rank != 1)
>  	{
> -	  if (!gfc_is_simply_contiguous (rvalue, true))
> +	  if (!gfc_is_simply_contiguous (rvalue, true, false))
>  	    {
>  	      gfc_error ("Rank remapping target must be rank 1 or"
>  			 " simply contiguous at %L", &rvalue->where);
> @@ -4601,7 +4601,7 @@ gfc_has_ultimate_pointer (gfc_expr *e)
>     a "(::1)" is accepted.  */
>  
>  bool
> -gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
> +gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
>  {
>    bool colon;
>    int i;
> @@ -4615,7 +4615,7 @@ gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
>    else if (expr->expr_type != EXPR_VARIABLE)
>      return false;
>  
> -  if (expr->rank == 0)
> +  if (!permit_element && expr->rank == 0)
>      return false;
>  
>    for (ref = expr->ref; ref; ref = ref->next)
> diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
> index 9f61e45..d203c32 100644
> --- a/gcc/fortran/gfortran.h
> +++ b/gcc/fortran/gfortran.h
> @@ -2982,7 +2982,7 @@ void gfc_free_actual_arglist (gfc_actual_arglist *);
>  gfc_actual_arglist *gfc_copy_actual_arglist (gfc_actual_arglist *);
>  const char *gfc_extract_int (gfc_expr *, int *);
>  bool is_subref_array (gfc_expr *);
> -bool gfc_is_simply_contiguous (gfc_expr *, bool);
> +bool gfc_is_simply_contiguous (gfc_expr *, bool, bool);
>  bool gfc_check_init_expr (gfc_expr *);
>  
>  gfc_expr *gfc_build_conversion (gfc_expr *);
> diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
> index f74239d..bfd5d36 100644
> --- a/gcc/fortran/interface.c
> +++ b/gcc/fortran/interface.c
> @@ -2020,7 +2020,7 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
>  
>    /* F2008, C1241.  */
>    if (formal->attr.pointer && formal->attr.contiguous
> -      && !gfc_is_simply_contiguous (actual, true))
> +      && !gfc_is_simply_contiguous (actual, true, false))
>      {
>        if (where)
>  	gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
> @@ -2131,15 +2131,17 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
>  
>    if (formal->attr.codimension)
>      {
> -      /* F2008, 12.5.2.8.  */
> +      /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048).  */
> +      /* F2015, 12.5.2.8.  */
>        if (formal->attr.dimension
>  	  && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
>  	  && gfc_expr_attr (actual).dimension
> -	  && !gfc_is_simply_contiguous (actual, true))
> +	  && !gfc_is_simply_contiguous (actual, true, true))
>  	{
>  	  if (where)
>  	    gfc_error ("Actual argument to %qs at %L must be simply "
> -		       "contiguous", formal->name, &actual->where);
> +		       "contiguous or an element of such an array",
> +		       formal->name, &actual->where);
>  	  return 0;
>  	}
>  
> @@ -2179,7 +2181,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
>        && (actual->symtree->n.sym->attr.asynchronous
>           || actual->symtree->n.sym->attr.volatile_)
>        &&  (formal->attr.asynchronous || formal->attr.volatile_)
> -      && actual->rank && formal->as && !gfc_is_simply_contiguous (actual, true)
> +      && actual->rank && formal->as
> +      && !gfc_is_simply_contiguous (actual, true, false)
>        && ((formal->as->type != AS_ASSUMED_SHAPE
>  	   && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
>  	  || formal->attr.contiguous))
> diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
> index 69f6e19..6e24e2e 100644
> --- a/gcc/fortran/trans-array.c
> +++ b/gcc/fortran/trans-array.c
> @@ -7386,7 +7386,7 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
>  		  && ref->u.ar.as->type != AS_ASSUMED_RANK
>  		  && ref->u.ar.as->type != AS_ASSUMED_SHAPE)
>  		      ||
> -	     gfc_is_simply_contiguous (expr, false));
> +	     gfc_is_simply_contiguous (expr, false, true));
>  
>    no_pack = contiguous && no_pack;
>  
> @@ -7464,7 +7464,7 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
>      }
>  
>    if (g77 || (fsym && fsym->attr.contiguous
> -	      && !gfc_is_simply_contiguous (expr, false)))
> +	      && !gfc_is_simply_contiguous (expr, false, true)))
>      {
>        tree origptr = NULL_TREE;
>  
> diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
> index 21efe44..743148e 100644
> --- a/gcc/fortran/trans-intrinsic.c
> +++ b/gcc/fortran/trans-intrinsic.c
> @@ -6244,7 +6244,7 @@ gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
>        source_type = gfc_get_element_type (TREE_TYPE (argse.expr));
>  
>        /* Repack the source if not simply contiguous.  */
> -      if (!gfc_is_simply_contiguous (arg->expr, false))
> +      if (!gfc_is_simply_contiguous (arg->expr, false, true))
>  	{
>  	  tmp = gfc_build_addr_expr (NULL_TREE, argse.expr);
>  
> @@ -7142,7 +7142,7 @@ conv_isocbinding_function (gfc_se *se, gfc_expr *expr)
>      {
>        if (arg->expr->rank == 0)
>  	gfc_conv_expr_reference (se, arg->expr);
> -      else if (gfc_is_simply_contiguous (arg->expr, false))
> +      else if (gfc_is_simply_contiguous (arg->expr, false, false))
>  	gfc_conv_array_parameter (se, arg->expr, true, NULL, NULL, NULL);
>        else
>  	{
> diff --git a/gcc/testsuite/gfortran.dg/coarray_argument_1.f90 b/gcc/testsuite/gfortran.dg/coarray_argument_1.f90
> new file mode 100644
> index 0000000..511da29
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/coarray_argument_1.f90
> @@ -0,0 +1,14 @@
> +! { dg-do compile }
> +! { dg-options "-fcoarray=lib" }
> +!
> +! PR fortran/45859
> +! Interpretation request F08/0048
> +!
> +   interface
> +      subroutine sub (x)
> +         real x(10)[*]
> +      end subroutine
> +   end interface
> +   real :: x(100)[*]
> +   call sub (x(10))
> +   end

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Patch, Fortran] PR45859 - Permit array elements to coarray dummy arguments
  2015-12-04 13:16 ` Tobias Burnus
@ 2015-12-09  7:24   ` Tobias Burnus
  2015-12-12 16:47     ` Steve Kargl
  0 siblings, 1 reply; 4+ messages in thread
From: Tobias Burnus @ 2015-12-09  7:24 UTC (permalink / raw)
  To: Tobias Burnus, gcc-patches, fortran

PING

On 4 December 2015, Tobias Burnus wrote:
> I pressed "Send" too early - as the testsuite fails unless the following
> patch is applied. I think I will just use this test case (with patch)
> instead of adding a new test-suite file. Required patch:
>
> --- a/gcc/testsuite/gfortran.dg/coarray_args_2.f90
> +++ b/gcc/testsuite/gfortran.dg/coarray_args_2.f90
> @@ -40,8 +40,7 @@ program rank_mismatch_02
>     sync all
>
>     call subr(ndim, a(1:1,2)) ! OK
> -  call subr(ndim, a(1,2)) ! { dg-error "must be simply contiguous" }
> -                          ! See also F08/0048 and PR 45859 about the validity
> +  call subr(ndim, a(1,2)) ! See also F08/0048 and PR 45859 about the validity
>     if (this_image() == 1) then
>        write(*, *) 'OK'
>     end if
>
>
> Tobias
>
> On Fri, Dec 04, 2015 at 01:39:22PM +0100, Tobias Burnus wrote:
>> This patch permits
>>
>>     interface
>>        subroutine sub (x)
>>           real x(10)[*]
>>        end subroutine
>>     end interface
>>     real :: x(100)[*]
>>     call sub (x(10))
>>     end
>>
>> where one passes an array element ("x(10)") of a contiguous array to a
>> coarray dummy argument. That's permitted per interpretation request
>> F08/0048, which ended up in Fortran 2008's Corrigendum 2 - and is also
>> in the current Fortran 2015 drafts:
>>
>> "If the dummy argument is an array coarray that has the CONTIGUOUS attribute
>>   or is not of assumed shape, the corresponding actual argument shall be
>>   simply contiguous or an element of a simply contiguous array."
>>
>> the "or ..." of the last line was added in the corrigendum.
>>
>>
>> I hope and think that I got the true/false of the other users correct - in
>> most cases, it probably doesn't matter as the caller is only reached for
>> expr->rank > 0.
>>
>> Build and regtested on x86-64-gnu-linux.
>> OK for the trunk?
>>
>> Tobias
>> gcc/fortran
>> 	PR fortran/45859
>> 	* expr.c (gfc_is_simply_contiguous): Optionally permit array elements.
>> 	(gfc_check_pointer_assign): Update call.
>> 	* interface.c (compare_parameter): Ditto.
>> 	* trans-array.c (gfc_conv_array_parameter): Ditto.
>> 	* trans-intrinsic.c (gfc_conv_intrinsic_transfer,
>> 	conv_isocbinding_function): Ditto.
>> 	* gfortran.h (gfc_is_simply_contiguous):
>>
>> gcc/testsuite/
>> 	PR fortran/45859
>> 	* gfortran.dg/coarray_argument_1.f90: New.
>>
>> diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
>> index 2aeb0b5..5dd90ef 100644
>> --- a/gcc/fortran/expr.c
>> +++ b/gcc/fortran/expr.c
>> @@ -3683,7 +3683,7 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
>>   	 and F2008 must be allowed.  */
>>         if (rvalue->rank != 1)
>>   	{
>> -	  if (!gfc_is_simply_contiguous (rvalue, true))
>> +	  if (!gfc_is_simply_contiguous (rvalue, true, false))
>>   	    {
>>   	      gfc_error ("Rank remapping target must be rank 1 or"
>>   			 " simply contiguous at %L", &rvalue->where);
>> @@ -4601,7 +4601,7 @@ gfc_has_ultimate_pointer (gfc_expr *e)
>>      a "(::1)" is accepted.  */
>>   
>>   bool
>> -gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
>> +gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
>>   {
>>     bool colon;
>>     int i;
>> @@ -4615,7 +4615,7 @@ gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
>>     else if (expr->expr_type != EXPR_VARIABLE)
>>       return false;
>>   
>> -  if (expr->rank == 0)
>> +  if (!permit_element && expr->rank == 0)
>>       return false;
>>   
>>     for (ref = expr->ref; ref; ref = ref->next)
>> diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
>> index 9f61e45..d203c32 100644
>> --- a/gcc/fortran/gfortran.h
>> +++ b/gcc/fortran/gfortran.h
>> @@ -2982,7 +2982,7 @@ void gfc_free_actual_arglist (gfc_actual_arglist *);
>>   gfc_actual_arglist *gfc_copy_actual_arglist (gfc_actual_arglist *);
>>   const char *gfc_extract_int (gfc_expr *, int *);
>>   bool is_subref_array (gfc_expr *);
>> -bool gfc_is_simply_contiguous (gfc_expr *, bool);
>> +bool gfc_is_simply_contiguous (gfc_expr *, bool, bool);
>>   bool gfc_check_init_expr (gfc_expr *);
>>   
>>   gfc_expr *gfc_build_conversion (gfc_expr *);
>> diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
>> index f74239d..bfd5d36 100644
>> --- a/gcc/fortran/interface.c
>> +++ b/gcc/fortran/interface.c
>> @@ -2020,7 +2020,7 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
>>   
>>     /* F2008, C1241.  */
>>     if (formal->attr.pointer && formal->attr.contiguous
>> -      && !gfc_is_simply_contiguous (actual, true))
>> +      && !gfc_is_simply_contiguous (actual, true, false))
>>       {
>>         if (where)
>>   	gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
>> @@ -2131,15 +2131,17 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
>>   
>>     if (formal->attr.codimension)
>>       {
>> -      /* F2008, 12.5.2.8.  */
>> +      /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048).  */
>> +      /* F2015, 12.5.2.8.  */
>>         if (formal->attr.dimension
>>   	  && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
>>   	  && gfc_expr_attr (actual).dimension
>> -	  && !gfc_is_simply_contiguous (actual, true))
>> +	  && !gfc_is_simply_contiguous (actual, true, true))
>>   	{
>>   	  if (where)
>>   	    gfc_error ("Actual argument to %qs at %L must be simply "
>> -		       "contiguous", formal->name, &actual->where);
>> +		       "contiguous or an element of such an array",
>> +		       formal->name, &actual->where);
>>   	  return 0;
>>   	}
>>   
>> @@ -2179,7 +2181,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
>>         && (actual->symtree->n.sym->attr.asynchronous
>>            || actual->symtree->n.sym->attr.volatile_)
>>         &&  (formal->attr.asynchronous || formal->attr.volatile_)
>> -      && actual->rank && formal->as && !gfc_is_simply_contiguous (actual, true)
>> +      && actual->rank && formal->as
>> +      && !gfc_is_simply_contiguous (actual, true, false)
>>         && ((formal->as->type != AS_ASSUMED_SHAPE
>>   	   && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
>>   	  || formal->attr.contiguous))
>> diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
>> index 69f6e19..6e24e2e 100644
>> --- a/gcc/fortran/trans-array.c
>> +++ b/gcc/fortran/trans-array.c
>> @@ -7386,7 +7386,7 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
>>   		  && ref->u.ar.as->type != AS_ASSUMED_RANK
>>   		  && ref->u.ar.as->type != AS_ASSUMED_SHAPE)
>>   		      ||
>> -	     gfc_is_simply_contiguous (expr, false));
>> +	     gfc_is_simply_contiguous (expr, false, true));
>>   
>>     no_pack = contiguous && no_pack;
>>   
>> @@ -7464,7 +7464,7 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
>>       }
>>   
>>     if (g77 || (fsym && fsym->attr.contiguous
>> -	      && !gfc_is_simply_contiguous (expr, false)))
>> +	      && !gfc_is_simply_contiguous (expr, false, true)))
>>       {
>>         tree origptr = NULL_TREE;
>>   
>> diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
>> index 21efe44..743148e 100644
>> --- a/gcc/fortran/trans-intrinsic.c
>> +++ b/gcc/fortran/trans-intrinsic.c
>> @@ -6244,7 +6244,7 @@ gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
>>         source_type = gfc_get_element_type (TREE_TYPE (argse.expr));
>>   
>>         /* Repack the source if not simply contiguous.  */
>> -      if (!gfc_is_simply_contiguous (arg->expr, false))
>> +      if (!gfc_is_simply_contiguous (arg->expr, false, true))
>>   	{
>>   	  tmp = gfc_build_addr_expr (NULL_TREE, argse.expr);
>>   
>> @@ -7142,7 +7142,7 @@ conv_isocbinding_function (gfc_se *se, gfc_expr *expr)
>>       {
>>         if (arg->expr->rank == 0)
>>   	gfc_conv_expr_reference (se, arg->expr);
>> -      else if (gfc_is_simply_contiguous (arg->expr, false))
>> +      else if (gfc_is_simply_contiguous (arg->expr, false, false))
>>   	gfc_conv_array_parameter (se, arg->expr, true, NULL, NULL, NULL);
>>         else
>>   	{
>> diff --git a/gcc/testsuite/gfortran.dg/coarray_argument_1.f90 b/gcc/testsuite/gfortran.dg/coarray_argument_1.f90
>> new file mode 100644
>> index 0000000..511da29
>> --- /dev/null
>> +++ b/gcc/testsuite/gfortran.dg/coarray_argument_1.f90
>> @@ -0,0 +1,14 @@
>> +! { dg-do compile }
>> +! { dg-options "-fcoarray=lib" }
>> +!
>> +! PR fortran/45859
>> +! Interpretation request F08/0048
>> +!
>> +   interface
>> +      subroutine sub (x)
>> +         real x(10)[*]
>> +      end subroutine
>> +   end interface
>> +   real :: x(100)[*]
>> +   call sub (x(10))
>> +   end
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Patch, Fortran] PR45859 - Permit array elements to coarray dummy arguments
  2015-12-09  7:24   ` Tobias Burnus
@ 2015-12-12 16:47     ` Steve Kargl
  0 siblings, 0 replies; 4+ messages in thread
From: Steve Kargl @ 2015-12-12 16:47 UTC (permalink / raw)
  To: Tobias Burnus; +Cc: Tobias Burnus, gcc-patches, fortran

On Wed, Dec 09, 2015 at 08:24:39AM +0100, Tobias Burnus wrote:
> PING
> 

OK.

-- 
Steve

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-12-12 16:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-04 12:39 [Patch, Fortran] PR45859 - Permit array elements to coarray dummy arguments Tobias Burnus
2015-12-04 13:16 ` Tobias Burnus
2015-12-09  7:24   ` Tobias Burnus
2015-12-12 16:47     ` Steve Kargl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).