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