diff mbox

[Fortran] PR57906 - fix issue with coarray component assignment

Message ID 51ED693E.6000305@net-b.de
State New
Headers show

Commit Message

Tobias Burnus July 22, 2013, 5:17 p.m. UTC
For coarrays, an assignment does not affect the allocation status. That 
also implies that the type parameters, shape and effective types between 
the LHS and RHS have to match.

For coarrays components, that's handled (since Rev. 200955) by 
re-assigning the saved data after the assignment:

  tmp  = LHS;
  LHS = RHS;
  LHS.caf = RHS.caf;

However, as the PR shows, the middle end for some reasons optimizes the 
latter assignment away. My impression is that that's due to the 
"restrict" issue (PR45586). The patch now only assigns the data 
component, which seems to work:

  tmp  = LHS;
  LHS = RHS;
  LHS.caf.data = RHS.caf.data;

Other changes:
- Change space+tab to tab
- Add a test case, which I seemingly forgot to include in r200955


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

Tobias

Comments

Steve Kargl July 22, 2013, 5:23 p.m. UTC | #1
On Mon, Jul 22, 2013 at 07:17:50PM +0200, Tobias Burnus wrote:
> For coarrays, an assignment does not affect the allocation status. That 
> also implies that the type parameters, shape and effective types between 
> the LHS and RHS have to match.
> 
> For coarrays components, that's handled (since Rev. 200955) by 
> re-assigning the saved data after the assignment:
> 
>   tmp  = LHS;
>   LHS = RHS;
>   LHS.caf = RHS.caf;
> 
> However, as the PR shows, the middle end for some reasons optimizes the 
> latter assignment away. My impression is that that's due to the 
> "restrict" issue (PR45586). The patch now only assigns the data 
> component, which seems to work:
> 
>   tmp  = LHS;
>   LHS = RHS;
>   LHS.caf.data = RHS.caf.data;
> 
> Other changes:
> - Change space+tab to tab
> - Add a test case, which I seemingly forgot to include in r200955
> 
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?
> 

OK.
diff mbox

Patch

2013-07-22  Tobias Burnus  <burnus@net-b.de>

	PR fortran/57906
	PR fortran/52052
	* class.c (gfc_build_class_symbol): Set coarray_comp.
	* trans-array.c (structure_alloc_comps): For coarrays,
	directly use the data pointer address.

2013-07-22  Tobias Burnus  <burnus@net-b.de>

	PR fortran/57906
	PR fortran/52052
	* coarray/lib_realloc_1.f90: Permit optimization.
	* gfortran.dg/coarray_31.f90: New.

diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index ba8efa9..51bfd56 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -666,6 +666,7 @@  gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
 
       fclass->attr.extension = ts->u.derived->attr.extension + 1;
       fclass->attr.alloc_comp = ts->u.derived->attr.alloc_comp;
+      fclass->attr.coarray_comp = ts->u.derived->attr.coarray_comp;
     }
 
   fclass->attr.is_class = 1;
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 3fdd8d9..0aac678 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -7589,9 +7589,9 @@  structure_alloc_comps (gfc_symbol * der_type, tree decl,
 
 	  if ((c->ts.type == BT_DERIVED && !c->attr.pointer)
 	      || (c->ts.type == BT_CLASS && !CLASS_DATA (c)->attr.class_pointer))
- 	    {
- 	      comp = fold_build3_loc (input_location, COMPONENT_REF, ctype,
- 				      decl, cdecl, NULL_TREE);
+	    {
+	      comp = fold_build3_loc (input_location, COMPONENT_REF, ctype,
+				      decl, cdecl, NULL_TREE);
 
 	      /* The finalizer frees allocatable components.  */
 	      called_dealloc_with_status
@@ -7737,8 +7737,17 @@  structure_alloc_comps (gfc_symbol * der_type, tree decl,
 				  cdecl, NULL_TREE);
 	  dcmp = fold_build3_loc (input_location, COMPONENT_REF, ctype, dest,
 				  cdecl, NULL_TREE);
+
 	  if (c->attr.codimension)
-	    gfc_add_modify (&fnblock, dcmp, comp);
+	    {
+	      if (c->ts.type == BT_CLASS)
+		{
+		  comp = gfc_class_data_get (comp);
+		  dcmp = gfc_class_data_get (dcmp);
+		}
+	      gfc_conv_descriptor_data_set (&fnblock, dcmp,
+					   gfc_conv_descriptor_data_get (comp));
+	    }
 	  else
 	    {
 	      tmp = structure_alloc_comps (c->ts.u.derived, comp, dcmp,
diff --git a/gcc/testsuite/gfortran.dg/coarray/lib_realloc_1.f90 b/gcc/testsuite/gfortran.dg/coarray/lib_realloc_1.f90
index ed906f5..f3d7f35 100644
--- a/gcc/testsuite/gfortran.dg/coarray/lib_realloc_1.f90
+++ b/gcc/testsuite/gfortran.dg/coarray/lib_realloc_1.f90
@@ -1,5 +1,4 @@ 
 ! { dg-do run }
-! { dg-options "-O0" }
 !
 ! Test that for CAF components _gfortran_caf_deregister is called
 ! Test that norealloc happens for CAF components during assignment
--- /dev/null	2013-07-22 10:09:57.614189406 +0200
+++ gcc/gcc/testsuite/gfortran.dg/coarray_31.f90	2013-07-22 19:13:40.460945010 +0200
@@ -0,0 +1,22 @@ 
+! { dg-do compile }
+! { dg-options "-fdump-tree-original -fcoarray=single" }
+!
+! PR fortran/57906
+! PR fortran/52052
+!
+type t
+  integer, allocatable :: x(:)[:]
+  class(*), allocatable :: z(:)[:]
+  class(*), allocatable :: d[:]
+end type t
+type t2
+  type(t) :: y
+end type t2
+type(t2) :: a, b
+a = b
+end
+
+! { dg-final { scan-tree-dump "a.y.x.data = D.\[0-9\]+.y.x.data;" "original" } }
+! { dg-final { scan-tree-dump "a.y.z._data.data = D.\[0-9\]+.y.z._data.data;" "original" } }
+! { dg-final { scan-tree-dump "a.y.d._data.data = D.\[0-9\]+.y.d._data.data;" "original" } }
+! { dg-final { cleanup-tree-dump "original" } }