diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gfortran.dg/typebound_operator_12.f03')
-rw-r--r-- | gcc-4.9/gcc/testsuite/gfortran.dg/typebound_operator_12.f03 | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gfortran.dg/typebound_operator_12.f03 b/gcc-4.9/gcc/testsuite/gfortran.dg/typebound_operator_12.f03 new file mode 100644 index 000000000..4f729570b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gfortran.dg/typebound_operator_12.f03 @@ -0,0 +1,43 @@ +! { dg-do run } +! PR51634 - Handle allocatable components correctly in expressions +! involving typebound operators. See comment 2 of PR. +! +! 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 :: product + generic :: operator(+) => total + generic :: operator(*) => product + end type +contains + type(soop_stars) function product(lhs,rhs) + class(soop_stars) ,intent(in) :: lhs + real ,intent(in) :: rhs + product%position = lhs%position*rhs + product%velocity = lhs%velocity*rhs + end function + + type(soop_stars) function total(lhs,rhs) + class(soop_stars) ,intent(in) :: lhs,rhs + total%position = lhs%position + rhs%position + total%velocity = lhs%velocity + rhs%velocity + end function +end module + +program main + use soop_stars_class ,only : soop_stars + implicit none + type(soop_stars) :: fireworks + real :: dt + fireworks%position = [1,2,3] + fireworks%velocity = [4,5,6] + dt = 5 + fireworks = fireworks + fireworks*dt + if (any (fireworks%position .ne. [6, 12, 18])) call abort + if (any (fireworks%velocity .ne. [24, 30, 36])) call abort +end program |