diff mbox series

[fortran] PR93671 - gfortran 8-10 ICE on intrinsic assignment to allocatable derived-type component of coarray

Message ID 20200810170327.6626f1cb@vepi2
State New
Headers show
Series [fortran] PR93671 - gfortran 8-10 ICE on intrinsic assignment to allocatable derived-type component of coarray | expand

Commit Message

Andre Vehreschild Aug. 10, 2020, 3:03 p.m. UTC
Hi folks,

long time, no see.  I was asked by Damian to do some Coarray stuff in gfortran
so here is the first step on fixing a bug. The issue at hand is, that the
coarray handling is not propagated correctly and later on the coarray-token
not generated/retrieved from the correct position leading to coarray programs to
crash/hang. This patch fixes at least the misbehavior reported in the PR. More
to come.

Regtests ok on FC31.x86_64. Ok for trunk?

Regards,
	Andre
--
Andre Vehreschild * Email: vehre ad gmx dot de
gcc/fortran/ChangeLog:

2020-08-10  Andre Vehreschild  <vehre@gcc.gnu.org>

	PR fortran/93671
	* trans-array.c (structure_alloc_comps): Keep caf-mode when applying to
	components; get the caf_token correctly for allocated scalar components.

gcc/testsuite/ChangeLog:

2020-08-10  Andre Vehreschild  <vehre@gcc.gnu.org>

	PR fortran/93671
	* gfortran.dg/coarray/pr93671.f90: New test.

Comments

Thomas Koenig Aug. 12, 2020, 4:58 p.m. UTC | #1
Hi Andre,

> Regtests ok on FC31.x86_64. Ok for trunk?

Good thing you're back!  Any help with bugfixing is
highly appreciated, and Coarrays certainly can use
some work.

The patch is OK for trunk.

Best regards

	Thomas
Jerry D Aug. 13, 2020, 2:04 a.m. UTC | #2
This look good, OK to commit.

Thanks,

Jerry

On 8/10/20 8:03 AM, Andre Vehreschild wrote:
> Hi folks,
>
> long time, no see.  I was asked by Damian to do some Coarray stuff in gfortran
> so here is the first step on fixing a bug. The issue at hand is, that the
> coarray handling is not propagated correctly and later on the coarray-token
> not generated/retrieved from the correct position leading to coarray programs to
> crash/hang. This patch fixes at least the misbehavior reported in the PR. More
> to come.
>
> Regtests ok on FC31.x86_64. Ok for trunk?
>
> Regards,
> 	Andre
> --
> Andre Vehreschild * Email: vehre ad gmx dot de
Andre Vehreschild Aug. 13, 2020, 2:09 p.m. UTC | #3
Hi Thomas,

thanks for the review. Committed to trunk.

That's what I am here for: to fix some issues with coarrays.

Regards,
	Andre

On Wed, 12 Aug 2020 18:58:01 +0200
Thomas Koenig <tkoenig@netcologne.de> wrote:

> Hi Andre,
>
> > Regtests ok on FC31.x86_64. Ok for trunk?
>
> Good thing you're back!  Any help with bugfixing is
> highly appreciated, and Coarrays certainly can use
> some work.
>
> The patch is OK for trunk.
>
> Best regards
>
> 	Thomas


--
Andre Vehreschild * Email: vehre ad gmx dot de
diff mbox series

Patch

diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 8f93b43bafb..7a1b2fc74c9 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -8627,14 +8627,13 @@  structure_alloc_comps (gfc_symbol * der_type, tree decl,

       vref = gfc_build_array_ref (var, index, NULL);

-      if ((purpose == COPY_ALLOC_COMP || purpose == COPY_ONLY_ALLOC_COMP)
-	  && !caf_enabled (caf_mode))
+      if (purpose == COPY_ALLOC_COMP || purpose == COPY_ONLY_ALLOC_COMP)
 	{
 	  tmp = build_fold_indirect_ref_loc (input_location,
 					     gfc_conv_array_data (dest));
 	  dref = gfc_build_array_ref (tmp, index, NULL);
 	  tmp = structure_alloc_comps (der_type, vref, dref, rank,
-				       COPY_ALLOC_COMP, 0, args);
+				       COPY_ALLOC_COMP, caf_mode, args);
 	}
       else
 	tmp = structure_alloc_comps (der_type, vref, NULL_TREE, rank, purpose,
@@ -9375,12 +9374,21 @@  structure_alloc_comps (gfc_symbol * der_type, tree decl,
 	      else if (flag_coarray == GFC_FCOARRAY_LIB
 		       && caf_in_coarray (caf_mode))
 		{
-		  tree dst_tok = c->as ? gfc_conv_descriptor_token (dcmp)
-				       : fold_build3_loc (input_location,
-							  COMPONENT_REF,
-							  pvoid_type_node, dest,
-							  c->caf_token,
-							  NULL_TREE);
+		  tree dst_tok;
+		  if (c->as)
+		    dst_tok = gfc_conv_descriptor_token (dcmp);
+		  else
+		    {
+		      /* For a scalar allocatable component the caf_token is
+			 the next component.  */
+		      if (!c->caf_token)
+			  c->caf_token = c->next->backend_decl;
+		      dst_tok = fold_build3_loc (input_location,
+						 COMPONENT_REF,
+						 pvoid_type_node, dest,
+						 c->caf_token,
+						 NULL_TREE);
+		    }
 		  tmp = duplicate_allocatable_coarray (dcmp, dst_tok, comp,
 						       ctype, rank);
 		}
diff --git a/gcc/testsuite/gfortran.dg/coarray/pr93671.f90 b/gcc/testsuite/gfortran.dg/coarray/pr93671.f90
new file mode 100644
index 00000000000..8d26ff88753
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray/pr93671.f90
@@ -0,0 +1,24 @@ 
+! { dg-do run }
+
+! PR/fortran 93671 - ICE on intrinsic assignment to allocatable derived-type
+!                    component of coarray
+
+  type flux_planes
+    integer, allocatable :: normals
+  end type
+
+  type package
+    type(flux_planes) surface_fluxes(1)
+  end type
+
+  type(package) mail[*], halo_data
+
+  halo_data%surface_fluxes(1)%normals = 1
+  mail = halo_data
+
+  if (any(size(mail%surface_fluxes) /= [1]) .OR. &
+          mail%surface_fluxes(1)%normals /= 1) then
+    stop 1
+  end if
+end
+