mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-26 12:23:59 +08:00
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:
parent
689ca4e7ae
commit
841b0c1f95
@ -1,3 +1,11 @@
|
||||
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)
|
||||
|
||||
|
@ -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);
|
||||
else
|
||||
/* 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 = gfc_build_addr_expr (NULL, tmp);
|
||||
return;
|
||||
}
|
||||
if (sym->attr.allocatable)
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
38
gcc/testsuite/gfortran.dg/auto_array_1.f90
Normal file
38
gcc/testsuite/gfortran.dg/auto_array_1.f90
Normal 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
|
Loading…
Reference in New Issue
Block a user