! { 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
