blob: 96c4f32da3947e170ad703e1fe1e26b9fe201d13 [file] [log] [blame]
! { dg-do run }
! PR51634 - Handle allocatable components correctly in expressions
! involving typebound operators. From comment 2 of PR but using
! classes throughout.
!
! Reported by Tobias Burnus <burnus@gcc.gnu.org>
!
module soop_stars_class
implicit none
type soop_stars
real, dimension(:), allocatable :: position,velocity
contains
procedure :: total
procedure :: mult
procedure :: assign
generic :: operator(+) => total
generic :: operator(*) => mult
generic :: assignment(=) => assign
end type
contains
function mult(lhs,rhs)
class(soop_stars) ,intent(in) :: lhs
real ,intent(in) :: rhs
class(soop_stars), allocatable :: mult
type(soop_stars) :: tmp
tmp = soop_stars (lhs%position*rhs, lhs%velocity*rhs)
allocate (mult, source = tmp)
end function
function total(lhs,rhs)
class(soop_stars) ,intent(in) :: lhs,rhs
class(soop_stars), allocatable :: total
type(soop_stars) :: tmp
tmp = soop_stars (lhs%position + rhs%position, &
lhs%velocity + rhs%velocity)
allocate (total, source = tmp)
end function
subroutine assign(lhs,rhs)
class(soop_stars), intent(in) :: rhs
class(soop_stars), intent(out) :: lhs
lhs%position = rhs%position
lhs%velocity = rhs%velocity
end subroutine
end module
program main
use soop_stars_class ,only : soop_stars
implicit none
class(soop_stars), allocatable :: fireworks
real :: dt
allocate (fireworks, source = soop_stars ([1,2,3], [4,5,6]))
dt = 5
fireworks = fireworks + fireworks*dt
if (any (fireworks%position .ne. [6, 12, 18])) STOP 1
if (any (fireworks%velocity .ne. [24, 30, 36])) STOP 2
end program