diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c487767e9611cbe8a325518834e7d6c9314e1b36..910de0d0f324fc6508d1822982ad254e2ed07a78 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2006-10-14 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/29371 + * trans-expr.c (gfc_trans_pointer_assignment): Add the expression + for the assignment of null to the data field to se->pre, rather + than block. + 2006-10-14 Kazu Hirata <kazu@codesourcery.com> * intrinsic.texi: Fix typos. diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 875092fbea197fb653013528261fa340fb00d8c7..190a11560daecb452e186b7a701ef9290c7664bd 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -3149,7 +3149,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) { case EXPR_NULL: /* Just set the data pointer to null. */ - gfc_conv_descriptor_data_set (&block, lse.expr, null_pointer_node); + gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node); break; case EXPR_VARIABLE: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dbdd789bdf2479d40e29031abaa8ae6239e8af3c..075f175dc46bbc64c8ecdcb14afdfa5eee8a307c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-14 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/29371 + * gfortran.dg/nullify_3.f90: New test. + 2006-10-14 Eric Botcazou <ebotcazou@libertysurf.fr> * gcc.dg/pthread-init-2.c (dg-options): Define _POSIX_C_SOURCE=199506L diff --git a/gcc/testsuite/gfortran.dg/nullify_3.f90 b/gcc/testsuite/gfortran.dg/nullify_3.f90 new file mode 100644 index 0000000000000000000000000000000000000000..7d202a25893ef20f7cb90c7a7ee3585691fd1a13 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/nullify_3.f90 @@ -0,0 +1,26 @@ +! { dg-do run } +! { dg-options "-O0 -fbounds-check" } +! Tests patch for PR29371, in which the null pointer +! assignment would cause a segfault with the bounds +! check on. +! +! Contributed by Tobias Burnus <tobias.burnus@physik.fu-berlin.de> +! +program test + implicit none + type projector_t + real, pointer :: ket(:, :), bra(:, :) + end type projector_t + + type(projector_t),pointer, dimension(:) :: p + integer :: stat,i + allocate(p(2),stat=stat) + do i = 1, 2 + nullify(p(i)%bra) + nullify(p(i)%ket) + end do + do i = 1, 2 + if (associated (p(i)%bra)) call abort () + if (associated (p(i)%ket)) call abort () + end do +end program