(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
interface_operator_3.f90
! { dg-do compile }
! PR fortran/65454 - accept both old and new-style relational operators

module m
  implicit none
  private :: t1
  type t1
     integer :: i
  end type t1
  interface operator (==)
     module procedure :: my_cmp
  end interface
  interface operator (/=)
     module procedure :: my_cmp
  end interface
  interface operator (<=)
     module procedure :: my_cmp
  end interface
  interface operator (<)
     module procedure :: my_cmp
  end interface
  interface operator (>=)
     module procedure :: my_cmp
  end interface
  interface operator (>)
     module procedure :: my_cmp
  end interface
contains
  elemental function my_cmp (a, b) result (c)
    type(t1), intent(in) :: a, b
    logical              :: c
    c = a%i == b%i
  end function my_cmp
end module m

module m_os
  implicit none
  private :: t2
  type t2
     integer :: i
  end type t2
  interface operator (.eq.)
     module procedure :: my_cmp
  end interface
  interface operator (.ne.)
     module procedure :: my_cmp
  end interface
  interface operator (.le.)
     module procedure :: my_cmp
  end interface
  interface operator (.lt.)
     module procedure :: my_cmp
  end interface
  interface operator (.ge.)
     module procedure :: my_cmp
  end interface
  interface operator (.gt.)
     module procedure :: my_cmp
  end interface
contains
  elemental function my_cmp (a, b) result (c)
    type(t2), intent(in) :: a, b
    logical              :: c
    c = a%i .eq. b%i
  end function my_cmp
end module m_os

! new style only
module m1
  use m,    only: operator(==), operator(/=)
  use m,    only: operator(<=), operator(<)
  use m,    only: operator(>=), operator(>)
end module m1

! old -> new style
module m2
  use m_os, only: operator(==), operator(/=)
  use m_os, only: operator(<=), operator(<)
  use m_os, only: operator(>=), operator(>)
end module m2

! new -> old style
module m3
  use m,    only: operator(.eq.), operator(.ne.)
  use m,    only: operator(.le.), operator(.lt.)
  use m,    only: operator(.ge.), operator(.gt.)
end module m3

! old style only
module m4
  use m_os, only: operator(.eq.), operator(.ne.)
  use m_os, only: operator(.le.), operator(.lt.)
  use m_os, only: operator(.ge.), operator(.gt.)
end module m4

! new -> all styles
module m5
  use m,    only: operator(.eq.), operator(.ne.), operator(==), operator(/=)
  use m,    only: operator(.le.), operator(.lt.), operator(<=), operator(<)
  use m,    only: operator(.ge.), operator(.gt.), operator(>=), operator(>)
end module m5

! old -> all styles
module m6
  use m_os, only: operator(.eq.), operator(.ne.), operator(==), operator(/=)
  use m_os, only: operator(.le.), operator(.lt.), operator(<=), operator(<)
  use m_os, only: operator(.ge.), operator(.gt.), operator(>=), operator(>)
end module m6

! all -> all styles
module m7
  use m,    only: operator(.eq.), operator(.ne.), operator(==), operator(/=)
  use m,    only: operator(.le.), operator(.lt.), operator(<=), operator(<)
  use m,    only: operator(.ge.), operator(.gt.), operator(>=), operator(>)
  use m_os, only: operator(.eq.), operator(.ne.), operator(==), operator(/=)
  use m_os, only: operator(.le.), operator(.lt.), operator(<=), operator(<)
  use m_os, only: operator(.ge.), operator(.gt.), operator(>=), operator(>)
end module m7

module m_eq
  implicit none
  private :: t3
  type t3
     integer :: i
  end type t3
  interface operator (==)
     module procedure :: my_cmp
  end interface
contains
  elemental function my_cmp (a, b) result (c)
    type(t3), intent(in) :: a, b
    logical              :: c
    c = a%i == b%i
  end function my_cmp
end module m_eq

module m8
  use m_eq, only: operator(==), operator(.eq.)
  use m_eq, only: operator(/=)   ! { dg-error "operator ./=. referenced" }
  use m_eq, only: operator(.ne.) ! { dg-error "operator .\.ne\.. referenced" }
end module m8