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
This commit is contained in:
Paul Brook 2004-08-20 13:31:13 +00:00
parent 689ca4e7ae
commit 841b0c1f95
5 changed files with 63 additions and 8 deletions

View File

@ -1,12 +1,20 @@
2004-08-19 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
(Port from g95)
2004-08-20 Paul Brook <paul@codesourcery.com>
Canqun Yang <canqun@nudt.edu.cn>
PR fortran/17074
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)
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>

View File

@ -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
&& !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)

View File

@ -750,6 +750,8 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, int packed)
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));

View File

@ -1,3 +1,8 @@
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

View File

@ -0,0 +1,38 @@
! { 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