| ! { dg-do run } |
| ! tests that operator overloading works correctly for operators with |
| ! different spellings |
| module m |
| type t |
| integer :: i |
| end type t |
| |
| interface operator (==) |
| module procedure teq |
| end interface |
| |
| interface operator (/=) |
| module procedure tne |
| end interface |
| |
| interface operator (>) |
| module procedure tgt |
| end interface |
| |
| interface operator (>=) |
| module procedure tge |
| end interface |
| |
| interface operator (<) |
| module procedure tlt |
| end interface |
| |
| interface operator (<=) |
| module procedure tle |
| end interface |
| |
| type u |
| integer :: i |
| end type u |
| |
| interface operator (.eq.) |
| module procedure ueq |
| end interface |
| |
| interface operator (.ne.) |
| module procedure une |
| end interface |
| |
| interface operator (.gt.) |
| module procedure ugt |
| end interface |
| |
| interface operator (.ge.) |
| module procedure uge |
| end interface |
| |
| interface operator (.lt.) |
| module procedure ult |
| end interface |
| |
| interface operator (.le.) |
| module procedure ule |
| end interface |
| |
| contains |
| function teq (a, b) |
| logical teq |
| type (t), intent (in) :: a, b |
| |
| teq = a%i == b%i |
| end function teq |
| |
| function tne (a, b) |
| logical tne |
| type (t), intent (in) :: a, b |
| |
| tne = a%i /= b%i |
| end function tne |
| |
| function tgt (a, b) |
| logical tgt |
| type (t), intent (in) :: a, b |
| |
| tgt = a%i > b%i |
| end function tgt |
| |
| function tge (a, b) |
| logical tge |
| type (t), intent (in) :: a, b |
| |
| tge = a%i >= b%i |
| end function tge |
| |
| function tlt (a, b) |
| logical tlt |
| type (t), intent (in) :: a, b |
| |
| tlt = a%i < b%i |
| end function tlt |
| |
| function tle (a, b) |
| logical tle |
| type (t), intent (in) :: a, b |
| |
| tle = a%i <= b%i |
| end function tle |
| |
| function ueq (a, b) |
| logical ueq |
| type (u), intent (in) :: a, b |
| |
| ueq = a%i == b%i |
| end function ueq |
| |
| function une (a, b) |
| logical une |
| type (u), intent (in) :: a, b |
| |
| une = a%i /= b%i |
| end function une |
| |
| function ugt (a, b) |
| logical ugt |
| type (u), intent (in) :: a, b |
| |
| ugt = a%i > b%i |
| end function ugt |
| |
| function uge (a, b) |
| logical uge |
| type (u), intent (in) :: a, b |
| |
| uge = a%i >= b%i |
| end function uge |
| |
| function ult (a, b) |
| logical ult |
| type (u), intent (in) :: a, b |
| |
| ult = a%i < b%i |
| end function ult |
| |
| function ule (a, b) |
| logical ule |
| type (u), intent (in) :: a, b |
| |
| ule = a%i <= b%i |
| end function ule |
| end module m |
| |
| |
| program main |
| call checkt |
| call checku |
| |
| contains |
| |
| subroutine checkt |
| use m |
| |
| type (t) :: a, b |
| logical :: r1(6), r2(6) |
| a%i = 0; b%i = 1 |
| |
| r1 = (/ a == b, a /= b, a < b, a <= b, a > b, a >= b /) |
| r2 = (/ a.eq.b, a.ne.b, a.lt.b, a.le.b, a.gt.b, a.ge.b /) |
| if (any (r1.neqv.r2)) STOP 1 |
| if (any (r1.neqv. & |
| (/ .false.,.true.,.true., .true., .false.,.false. /) )) STOP 1 |
| end subroutine checkt |
| |
| subroutine checku |
| use m |
| |
| type (u) :: a, b |
| logical :: r1(6), r2(6) |
| a%i = 0; b%i = 1 |
| |
| r1 = (/ a == b, a /= b, a < b, a <= b, a > b, a >= b /) |
| r2 = (/ a.eq.b, a.ne.b, a.lt.b, a.le.b, a.gt.b, a.ge.b /) |
| if (any (r1.neqv.r2)) STOP 2 |
| if (any (r1.neqv. & |
| (/ .false.,.true.,.true., .true., .false.,.false. /) )) STOP 2 |
| end subroutine checku |
| end program main |