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" } }