From: Paul Brook Date: Fri, 20 Aug 2004 13:31:13 +0000 (+0000) Subject: re PR fortran/17077 (adjustable size arrays crash) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=841b0c1f951dc45d9df5a10e0a6b952a75a02ebd;p=gcc.git re PR fortran/17077 (adjustable size arrays crash) 2004-08-20 Paul Brook Canqun Yang 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 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1adf05549cc..fed67a6cb07 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,12 +1,20 @@ +2004-08-20 Paul Brook + Canqun Yang + + 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 - (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 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 3abb1959ebe..5299b4c2cdd 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 2b4edfc0e27..f8a0450ce1f 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 e8d985af0fe..6dd1b04041c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-08-20 Canqun Yang + + PR fortran/17077 + * gfortran.dg/auto_array_1.f90: New test. + 2004-08-19 Tobias Schlueter 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 00000000000..64cc113f863 --- /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