blob: fa7e552eea54bb1214dce67c1baf03d3e635da20 [file] [log] [blame]
! { dg-do run }
! Test the fix for PR113885, where not only was there a gimplifier ICE
! for a derived type 't' with no components but this version gave wrong
! results.
! Contributed by David Binderman <dcb314@hotmail.com>
!
module types
type t
integer :: i
contains
final :: finalize
end type t
integer :: ctr = 0
contains
impure elemental subroutine finalize(x)
type(t), intent(inout) :: x
ctr = ctr + 1
end subroutine finalize
end module types
impure elemental function elem(x)
use types
type(t), intent(in) :: x
type(t) :: elem
elem%i = x%i + 1
end function elem
impure elemental function elem2(x, y)
use types
type(t), intent(in) :: x, y
type(t) :: elem2
elem2%i = x%i + y%i
end function elem2
subroutine test1(x)
use types
interface
impure elemental function elem(x)
use types
type(t), intent(in) :: x
type(t) :: elem
end function elem
end interface
type(t) :: x(:)
type(t), allocatable :: y(:)
y = x
x = elem(y)
end subroutine test1
subroutine test2(x)
use types
interface
impure elemental function elem(x)
use types
type(t), intent(in) :: x
type(t) :: elem
end function elem
impure elemental function elem2(x, y)
use types
type(t), intent(in) :: x, y
type(t) :: elem2
end function elem2
end interface
type(t) :: x(:)
type(t), allocatable :: y(:)
y = x
x = elem2(elem(y), elem(y))
end subroutine test2
program test113885
use types
interface
subroutine test1(x)
use types
type(t) :: x(:)
end subroutine
subroutine test2(x)
use types
type(t) :: x(:)
end subroutine
end interface
type(t) :: x(2) = [t(1),t(2)]
call test1 (x)
if (any (x%i .ne. [2,3])) stop 1
if (ctr .ne. 6) stop 2
call test2 (x)
if (any (x%i .ne. [6,8])) stop 3
if (ctr .ne. 16) stop 4
end