Hi Paul, thanks for the review. Committed to trunk as r239237.
I will commit to gcc-6 in one week. Regards, Andre On Mon, 8 Aug 2016 11:33:06 +0200 Paul Richard Thomas <paul.richard.tho...@gmail.com> wrote: > Hi Andre, > > That looks fine to me. OK for 6-branch and trunk. > > Thanks for the patch. > > Paul > > On 7 August 2016 at 15:32, Andre Vehreschild <ve...@gmx.de> wrote: > > Hi all, > > > > attached patch fixes the ICE by ensuring that when the SOURCE=/MOLD= > > expression is an array-valued function call with no ref, the ref of > > object to allocate is taken. The array properties nevertheless are > > taken from the function's result. > > > > Bootstraps and regtests ok on x86_64-linux-gnu/F23. Ok for trunk and > > gcc-6? > > > > Regards, > > Andre > > -- > > Andre Vehreschild * Email: vehre ad gmx dot de > > > -- Andre Vehreschild * Email: vehre ad gmx dot de
Index: gcc/fortran/ChangeLog =================================================================== --- gcc/fortran/ChangeLog (Revision 239236) +++ gcc/fortran/ChangeLog (Arbeitskopie) @@ -1,5 +1,11 @@ 2016-08-08 Andre Vehreschild <ve...@gcc.gnu.org> + PR fortran/71936 + * trans-array.c (gfc_array_allocate): When SOURCE= is a function + stick with the ref of the object to allocate. + +2016-08-08 Andre Vehreschild <ve...@gcc.gnu.org> + PR fortran/72698 * trans-stmt.c (gfc_trans_allocate): Prevent generating code for copy of zero sized string and with it an ICE. Index: gcc/fortran/trans-array.c =================================================================== --- gcc/fortran/trans-array.c (Revision 239235) +++ gcc/fortran/trans-array.c (Arbeitskopie) @@ -5431,12 +5431,19 @@ if (ref->u.ar.type == AR_FULL && expr3 != NULL) { + gfc_ref *old_ref = ref; /* F08:C633: Array shape from expr3. */ ref = expr3->ref; /* Find the last reference in the chain. */ if (!retrieve_last_ref (&ref, &prev_ref)) - return false; + { + if (expr3->expr_type == EXPR_FUNCTION + && gfc_expr_attr (expr3).dimension) + ref = old_ref; + else + return false; + } alloc_w_e3_arr_spec = true; } Index: gcc/testsuite/ChangeLog =================================================================== --- gcc/testsuite/ChangeLog (Revision 239236) +++ gcc/testsuite/ChangeLog (Arbeitskopie) @@ -1,5 +1,10 @@ 2016-08-08 Andre Vehreschild <ve...@gcc.gnu.org> + PR fortran/71936 + * gfortran.dg/allocate_with_source_21.f03: New test. + +2016-08-08 Andre Vehreschild <ve...@gcc.gnu.org> + PR fortran/72698 * gfortran.dg/allocate_with_source_20.f03: New test. Index: gcc/testsuite/gfortran.dg/allocate_with_source_21.f03 =================================================================== --- gcc/testsuite/gfortran.dg/allocate_with_source_21.f03 (nicht existent) +++ gcc/testsuite/gfortran.dg/allocate_with_source_21.f03 (Arbeitskopie) @@ -0,0 +1,52 @@ +! { dg-do compile } + +! Check fix for pr71936. +! Contributed by Gerhard Steinmetz + +program p + type t + end type + + call test2() + call test4() + call test1() + call test3() +contains + function f_p() + class(t), pointer :: f_p(:) + nullify(f_p) + end + + function f_a() + class(t), allocatable :: f_a(:) + end + + subroutine test1() + class(t), allocatable :: x(:) + allocate (x, mold=f_a()) + deallocate (x) + allocate (x, source=f_a()) + end subroutine + + subroutine test2() + class(t), pointer :: x(:) + allocate (x, mold=f_p()) + deallocate (x) + allocate (x, source=f_p()) + end + + subroutine test3() + class(t), pointer :: x(:) + allocate (x, mold=f_a()) + deallocate (x) + allocate (x, source=f_a()) + end + + subroutine test4() + class(t), allocatable :: x(:) + allocate (x, mold=f_p()) + deallocate (x) + allocate (x, source=f_p()) + end subroutine +end +