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
2012-10-31  Tobias Burnus  <bur...@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  <bur...@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" } }

Reply via email to