blob: 6a580b2f1cf18fa6c5793f916496b9b282ecd7d8 [file] [log] [blame]
! { 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