From: Mikael Morin Date: Thu, 1 Sep 2011 15:52:39 +0000 (+0200) Subject: re PR fortran/50050 (Internal compiler error free_expr0 at expr.c:3709 via gfc_done_2) X-Git-Tag: releases/gcc-4.5.4~452 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f76574fd81e17231469dbb8552ff3070ec5e7b8a;p=thirdparty%2Fgcc.git re PR fortran/50050 (Internal compiler error free_expr0 at expr.c:3709 via gfc_done_2) 2011-09-01 Mikael Morin PR fortran/50050 * resolve.c (gfc_expr_to_initialize): Don't copy rank. Free copied shape. Recalculate shape and rank. 2011-09-01 Mikael Morin PR fortran/50050 * gfortran.dg/alloc_comp_initializer_3.f90: New test. * gfortran.dg/pointer_comp_init.f90: New test. From-SVN: r178424 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b6733fc553ca..c823d1828b96 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2011-09-01 Mikael Morin + + PR fortran/50050 + * resolve.c (gfc_expr_to_initialize): Don't copy rank. + Free copied shape. Recalculate shape and rank. + 2011-08-30 Tobias Burnus PR fortran/50163 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 1c606a3033cf..7abddb593a0f 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6172,10 +6172,19 @@ gfc_expr_to_initialize (gfc_expr *e) for (i = 0; i < ref->u.ar.dimen; i++) ref->u.ar.start[i] = ref->u.ar.end[i] = ref->u.ar.stride[i] = NULL; - result->rank = ref->u.ar.dimen; break; } + if (result->shape != NULL) + { + for (i = 0; i < result->rank; i++) + mpz_clear (result->shape[i]); + gfc_free (result->shape); + result->shape = NULL; + } + + /* Recalculate rank, shape, etc. */ + gfc_resolve_expr (result); return result; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 81fcfe153441..3ec6da5174bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-09-01 Mikael Morin + + PR fortran/50050 + * gfortran.dg/alloc_comp_initializer_3.f90: New test. + * gfortran.dg/pointer_comp_init.f90: New test. + 2011-08-30 Thomas Koenig Backport from trunk diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_initializer_3.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_initializer_3.f90 new file mode 100644 index 000000000000..014b069e5788 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/alloc_comp_initializer_3.f90 @@ -0,0 +1,15 @@ +! { dg-do compile } +! +! PR fortran/50050 +! Out of bound whilst releasing initialization of allocate object +! +! Contributed by someone + +program bug + implicit none + type foo + integer, pointer :: a => null() + end type + type(foo), dimension(:,:), allocatable :: data + allocate(data(1:1,1)) ! This used to lead to an ICE +end program diff --git a/gcc/testsuite/gfortran.dg/pointer_comp_init_1.f90 b/gcc/testsuite/gfortran.dg/pointer_comp_init_1.f90 new file mode 100644 index 000000000000..44f360e98261 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pointer_comp_init_1.f90 @@ -0,0 +1,30 @@ +! { dg-do compile } +! +! PR fortran/50050 +! ICE whilst trying to access NULL shape. + +! Reduced from the FoX library http://www1.gly.bris.ac.uk/~walker/FoX/ +! Contributed by Andrew Benson + +module m_common_attrs + implicit none + + type dict_item + end type dict_item + + type dict_item_ptr + type(dict_item), pointer :: d => null() + end type dict_item_ptr + +contains + + subroutine add_item_to_dict() + type(dict_item_ptr), pointer :: tempList(:) + integer :: n + + allocate(tempList(0:n+1)) + end subroutine add_item_to_dict + +end module m_common_attrs + +! { dg-final { cleanup-modules "m_common_attrs" } }