diff options
author | Paul Brook <pbrook@gcc.gnu.org> | 2004-08-20 13:31:13 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2004-08-20 13:31:13 +0000 |
commit | 841b0c1f951dc45d9df5a10e0a6b952a75a02ebd (patch) | |
tree | c0f8c05aa6a75da16bc6ae509e0aa81663c0d6dd /gcc | |
parent | 689ca4e7ae0dcac88d292029d281b75b52e8b431 (diff) | |
download | gcc-841b0c1f951dc45d9df5a10e0a6b952a75a02ebd.zip gcc-841b0c1f951dc45d9df5a10e0a6b952a75a02ebd.tar.gz gcc-841b0c1f951dc45d9df5a10e0a6b952a75a02ebd.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 8 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/auto_array_1.f90 | 38 |
5 files changed, 62 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1adf055..fed67a6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,12 +1,20 @@ +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> diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 3abb195..5299b4c 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -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) diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 2b4edfc..f8a0450 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -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)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e8d985a..6dd1b04 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gfortran.dg/auto_array_1.f90 b/gcc/testsuite/gfortran.dg/auto_array_1.f90 new file mode 100644 index 0000000..64cc113 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/auto_array_1.f90 @@ -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 |