From b7ddd3f14f3a5f3b9023b2b360c05c6426f37500 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Tue, 27 Oct 2015 18:03:18 +0000 Subject: [PATCH] re PR fortran/67933 (ICE for array of a derived type with allocatable class in derived type object) 2015-01-27 Paul Thomas PR fortran/67933 * gfortran.dg/allocate_with_source_15.f03: New test From-SVN: r229452 --- gcc/testsuite/ChangeLog | 5 ++ .../gfortran.dg/allocate_with_source_15.f03 | 79 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/allocate_with_source_15.f03 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1185917c913..230581c6e9a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-01-27 Paul Thomas + + PR fortran/67933 + * gfortran.dg/allocate_with_source_15.f03: New test + 2015-10-27 Thomas Schwinge James Norris diff --git a/gcc/testsuite/gfortran.dg/allocate_with_source_15.f03 b/gcc/testsuite/gfortran.dg/allocate_with_source_15.f03 new file mode 100644 index 00000000000..38f9cec355c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocate_with_source_15.f03 @@ -0,0 +1,79 @@ +! { dg-do run } +! +! Tests the fix for PR67933, which was a side effect of the fix for PR67171. +! +! Contributed by Andrew +! +module test_mod + implicit none + + type :: class_t + integer :: i + end type class_t + + type, extends(class_t) :: class_e + real :: r + end type class_e + + type :: wrapper_t + class(class_t), allocatable :: class_var +! type(class_t), allocatable :: class_var +! integer, allocatable :: class_id + end type wrapper_t + + type :: list_t + type(wrapper_t) :: classes(10) + contains + procedure :: Method + procedure :: Typeme + procedure :: Dealloc + end type list_t + +contains + subroutine Method(this) + class(list_t) :: this + integer :: i + do i = 1, 20 + if (i .gt. 10) then + allocate (this%classes(i)%class_var, source = class_t (i)) + else + allocate (this%classes(i)%class_var, source = class_e (i, real (2 * i))) + end if + end do + end subroutine Method + subroutine Dealloc(this) + class(list_t) :: this + integer :: i + do i = 1, 20 + if (allocated (this%classes(i)%class_var)) & + deallocate (this%classes(i)%class_var) + end do + end subroutine Dealloc + subroutine Typeme(this) + class(list_t) :: this + integer :: i, j(20) + real :: r(20) + real :: zero = 0.0 + do i = 1, 20 + j(i) = this%classes(i)%class_var%i + select type (p => this%classes(i)%class_var) + type is (class_e) + r(i) = p%r + class default + r(i) = zero + end select + end do +! print "(10i6,/)", j + if (any (j .ne. [(i, i = 1,20)])) call abort +! print "(10f6.2,/)", r + if (any (r(1:10) .ne. [(real (2 * i), i = 1,10)])) call abort + if (any (r(11:20) .ne. zero)) call abort + end subroutine Typeme +end module test_mod + + use test_mod + type(list_t) :: x + call x%Method + call x%Typeme + call x%dealloc +end -- 2.30.2