Patchwork [Fortran] PR55134 - Fix ASSOCIATE handling of arrays

login
register
mail settings
Submitter Tobias Burnus
Date Oct. 31, 2012, 4:42 p.m.
Message ID <509154E7.5020704@net-b.de>
Download mbox | patch
Permalink /patch/195937/
State New
Headers show

Comments

Tobias Burnus - Oct. 31, 2012, 4:42 p.m.
With "ASSOCIATE (A => array)", one generates internally "A" as 
AS_DEFERRED array. However, it is neither a pointer nor allocatable, 
unless "array" is.

When passing "A" as actual argument to a non-descriptor dummy, 
trans-array.c assumed that the actual argument had no descriptor, which 
lead to wrong code.

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

Tobias
Janus Weil - Oct. 31, 2012, 5:04 p.m.
> With "ASSOCIATE (A => array)", one generates internally "A" as AS_DEFERRED
> array. However, it is neither a pointer nor allocatable, unless "array" is.
>
> When passing "A" as actual argument to a non-descriptor dummy, trans-array.c
> assumed that the actual argument had no descriptor, which lead to wrong
> code.
>
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?

Looks obvious if you ask me ...

Thanks,
Janus
Paul Richard Thomas - Oct. 31, 2012, 8:54 p.m.
Dear Tobias,
>
> Looks obvious if you ask me ...

..and to me too.  OK for trunk.

Thanks

Paul

Patch

2012-10-31  Tobias Burnus  <burnus@net-b.de>

	PR fortran/55134
	* trans-array.c (gfc_conv_array_parameter): Regard AS_DEFERRED as
	array with descriptor.

2012-10-31  Tobias Burnus  <burnus@net-b.de>

	PR fortran/55134
	* gfortran.dg/associate_11.f90: New.

diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 3e684ee..26f0523 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -7012,6 +7012,7 @@  gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
       if (!sym->attr.pointer
 	  && sym->as
 	  && sym->as->type != AS_ASSUMED_SHAPE 
+	  && sym->as->type != AS_DEFERRED
 	  && sym->as->type != AS_ASSUMED_RANK 
 	  && !sym->attr.allocatable)
         {
--- /dev/null	2012-10-28 10:50:07.931755706 +0100
+++ gcc/gcc/testsuite/gfortran.dg/associate_11.f90	2012-10-31 17:36:07.000000000 +0100
@@ -0,0 +1,25 @@ 
+! { dg-do run }
+! { dg-options "-fdump-tree-original" }
+!
+! PR fortran/55134
+!
+! Contributed by Valery Weber
+!
+program bug
+  implicit none
+  integer,dimension(1)::i
+  i(:)=1
+  associate(a =>i)
+    call foo(a)
+  end associate
+! write(*,*) i
+  if (i(1) /= 2) call abort
+contains
+  subroutine foo(v)
+    integer, dimension(*) :: v
+    v(1)=2
+  end subroutine foo
+end program bug
+
+! { dg-final { scan-tree-dump-times "foo ..integer.kind=4..0:. . restrict. a.data.;" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }