From: Mikael Morin Date: Thu, 1 Sep 2011 19:19:55 +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.4.7~257 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13748c24d81a3585273cd9e4f66a139f0fc9b180;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: r178427 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 10e5800f0395..f8d74f64a8ab 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-04-16 Release Manager * GCC 4.4.6 released. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 595b46efee9c..4d5421d64b14 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -5180,10 +5180,19 @@ 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 f8b966e7d926..91596946f0a6 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-19 Tobias Burnus Backport from mainline 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" } }