From: Tobias Burnus Date: Fri, 12 Apr 2013 17:55:48 +0000 (+0200) Subject: re PR fortran/56929 ([OOP] [F08] ICE on dummy argument child class with coarray insid... X-Git-Tag: releases/gcc-4.9.0~6448 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=14c96bcafde23000b572ce0f46f0157901128c07;p=thirdparty%2Fgcc.git re PR fortran/56929 ([OOP] [F08] ICE on dummy argument child class with coarray inside parent) 2013-04-12 Tobias Burnus PR fortran/56929 * trans-array.c (duplicate_allocatable): Fix handling of scalar coarrays. 2013-04-12 Tobias Burnus PR fortran/56929 * gfortran.dg/coarray/alloc_comp_2.f90: New. From-SVN: r197930 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e290e49fcd70..c2b8a5d70bec 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2013-04-12 Tobias Burnus + + PR fortran/56929 + * trans-array.c (duplicate_allocatable): Fix handling + of scalar coarrays. + 2013-04-12 Janus Weil PR fortran/56261 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 05de50d2f049..6cb85d483119 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -7321,7 +7321,7 @@ duplicate_allocatable (tree dest, tree src, tree type, int rank, allocate memory to the destination. */ gfc_init_block (&block); - if (rank == 0) + if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (dest))) { tmp = null_pointer_node; tmp = fold_build2_loc (input_location, MODIFY_EXPR, type, dest, tmp); @@ -7348,7 +7348,11 @@ duplicate_allocatable (tree dest, tree src, tree type, int rank, null_data = gfc_finish_block (&block); gfc_init_block (&block); - nelems = get_full_array_size (&block, src, rank); + if (rank) + nelems = get_full_array_size (&block, src, rank); + else + nelems = gfc_index_one_node; + tmp = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (gfc_get_element_type (type))); size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, @@ -7374,7 +7378,7 @@ duplicate_allocatable (tree dest, tree src, tree type, int rank, /* Null the destination if the source is null; otherwise do the allocate and copy. */ - if (rank == 0) + if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (src))) null_cond = src; else null_cond = gfc_conv_descriptor_data_get (src); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b4fefc5b3f59..2f505a44d22a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-04-12 Tobias Burnus + + PR fortran/56929 + * gfortran.dg/coarray/alloc_comp_2.f90: New. + 2013-04-12 Vladimir Makarov PR target/56903 diff --git a/gcc/testsuite/gfortran.dg/coarray/alloc_comp_2.f90 b/gcc/testsuite/gfortran.dg/coarray/alloc_comp_2.f90 new file mode 100644 index 000000000000..13c823e74749 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/alloc_comp_2.f90 @@ -0,0 +1,19 @@ +! { dg-do compile } +! +! PR fortran/56929 +! +! Contributed by Damian Rouson +! +! Allocatable scalar corrays were mishandled (ICE) +! +module parent_coarray_component + type parent + real, allocatable :: dummy[:] + end type + type, extends(parent) :: child + end type +contains + subroutine do_something(this) + class(child) this + end +end