--- /dev/null
+! { 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