Commit 841b0c1f by Paul Brook

re PR fortran/17077 (adjustable size arrays crash)

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.
testsuite/
	* gfortran.dg/auto_array_1.f90: New test.

From-SVN: r86315
parent 689ca4e7
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> 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. * match.c (match_simple_forall, match_simple_where): Forward-declare.
(gfc_match_if): Order statement list alphabetically, add WHERE and (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_where, match_forall_header,
gfc_match_simple_forall): New functions. gfc_match_simple_forall): New functions.
(gfc_match_forall): Use match_forall_header. (gfc_match_forall): Use match_forall_header.
2004-08-19 Paul Brook <paul@codesourcery.com> 2004-08-19 Paul Brook <paul@codesourcery.com>
......
...@@ -3762,10 +3762,12 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, gfc_ss * ss, int g77) ...@@ -3762,10 +3762,12 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, gfc_ss * ss, int g77)
if (!sym->attr.pointer && sym->as->type != AS_ASSUMED_SHAPE if (!sym->attr.pointer && sym->as->type != AS_ASSUMED_SHAPE
&& !sym->attr.allocatable) && !sym->attr.allocatable)
{ {
if (!sym->attr.dummy) /* Some variables are declared directly, others are declard as
se->expr = gfc_build_addr_expr (NULL, tmp); pointers and allocated on the heap. */
if (sym->attr.dummy || POINTER_TYPE_P (TREE_TYPE (tmp)))
se->expr = tmp;
else else
se->expr = tmp; se->expr = gfc_build_addr_expr (NULL, tmp);
return; return;
} }
if (sym->attr.allocatable) if (sym->attr.allocatable)
......
...@@ -750,6 +750,8 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, int packed) ...@@ -750,6 +750,8 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, int packed)
if (packed < 3 || !known_stride) 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); type = build_pointer_type (type);
GFC_ARRAY_TYPE_P (type) = 1; GFC_ARRAY_TYPE_P (type) = 1;
TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type)); 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> 2004-08-19 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/17074 PR fortran/17074
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment