+2004-08-20 Paul Brook <paul@codesourcery.com>
+ Canqun Yang <canqun@nudt.edu.cn>
+
+ PR fortran/17077
+ * trans-array.c (gfc_conv_array_parameter): Pass correct pointer
+ for automatic arrays.
+ * trans-types.c (gfc_get_nodesc_array_type): Add comment.
+
2004-08-19 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
- (Port from g95)
+ (Port from g95)
- PR fortran/17074
+ PR fortran/17074
* match.c (match_simple_forall, match_simple_where): Forward-declare.
(gfc_match_if): Order statement list alphabetically, add WHERE and
- FORALL, remove double PAUSE.
+ FORALL, remove double PAUSE.
(gfc_match_simple_where, match_forall_header,
- gfc_match_simple_forall): New functions.
+ gfc_match_simple_forall): New functions.
(gfc_match_forall): Use match_forall_header.
2004-08-19 Paul Brook <paul@codesourcery.com>
if (!sym->attr.pointer && sym->as->type != AS_ASSUMED_SHAPE
&& !sym->attr.allocatable)
{
- if (!sym->attr.dummy)
- se->expr = gfc_build_addr_expr (NULL, tmp);
+ /* Some variables are declared directly, others are declard as
+ pointers and allocated on the heap. */
+ if (sym->attr.dummy || POINTER_TYPE_P (TREE_TYPE (tmp)))
+ se->expr = tmp;
else
- se->expr = tmp;
+ se->expr = gfc_build_addr_expr (NULL, tmp);
return;
}
if (sym->attr.allocatable)
if (packed < 3 || !known_stride)
{
+ /* For dummy arrays and automatic (heap allocated) arrays we
+ want a pointer to the array. */
type = build_pointer_type (type);
GFC_ARRAY_TYPE_P (type) = 1;
TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type));
+2004-08-20 Canqun Yang <canqun@nudt.edu.cn>
+
+ PR fortran/17077
+ * gfortran.dg/auto_array_1.f90: New test.
+
2004-08-19 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/17074
--- /dev/null
+! { dg-do run }
+! PR fortran/17077.
+! Automatic arrays are allocated on the heap. When used as an actual argument
+! we were passing the address of the pointer, not the pointer itself.
+
+program p
+ implicit none
+ integer:: n,m
+
+ n = 3
+ call foo(n)
+contains
+
+ subroutine foo(m)
+ integer:: m,i
+ integer:: z(m,m)
+
+ z = 0
+
+ call foo1(m,z)
+
+ ! Check it worked.
+ if (any (z .ne. reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)))) &
+ call abort
+ end subroutine foo
+
+ subroutine foo1(n,x)
+ integer:: n,i,j
+ integer:: x(n,n)
+
+ ! Assign values to x.
+ do i=1,n
+ do j=1,n
+ x(j,i)=j+(i-1)*n
+ enddo
+ enddo
+ end subroutine foo1
+end program