195199af4SPeter Klausler! RUN: %python %S/test_errors.py %s %flang_fc1 295199af4SPeter Klausler! Exercise ways to define and extend non-type-bound generics 3*32332909SPeter Klausler! TODO: crashes compiler (infinite recursion) when build with MSVC 4*32332909SPeter Klausler! XFAIL: system-windows 595199af4SPeter Klausler 695199af4SPeter Klauslermodule m1 795199af4SPeter Klausler type :: t1; end type 895199af4SPeter Klausler type :: t2; end type 995199af4SPeter Klausler interface operator(.eq.) 1095199af4SPeter Klausler module procedure :: eq1 1195199af4SPeter Klausler end interface 1295199af4SPeter Klausler generic :: operator(==) => eq2 1395199af4SPeter Klausler contains 1495199af4SPeter Klausler logical function eq1(x, y) 1595199af4SPeter Klausler type(t1), intent(in) :: x 1695199af4SPeter Klausler type(t2), intent(in) :: y 1795199af4SPeter Klausler eq1 = .true. 1895199af4SPeter Klausler end function 1995199af4SPeter Klausler logical function eq2(y, x) 2095199af4SPeter Klausler type(t2), intent(in) :: y 2195199af4SPeter Klausler type(t1), intent(in) :: x 2295199af4SPeter Klausler eq2 = .true. 2395199af4SPeter Klausler end function 2495199af4SPeter Klausler subroutine test1 2595199af4SPeter Klausler type(t1) :: a 2695199af4SPeter Klausler type(t2) :: b 2795199af4SPeter Klausler if (a == b .and. b .eq. a) print *, 'ok' 2895199af4SPeter Klausler end subroutine 2995199af4SPeter Klauslerend module 3095199af4SPeter Klausler 3195199af4SPeter Klauslermodule m2 3295199af4SPeter Klausler use m1 3395199af4SPeter Klausler type :: t3; end type 3495199af4SPeter Klausler interface operator(==) 3595199af4SPeter Klausler module procedure eq3 3695199af4SPeter Klausler end interface 3795199af4SPeter Klausler generic :: operator(.eq.) => eq4 3895199af4SPeter Klausler contains 3995199af4SPeter Klausler logical function eq3(x, y) 4095199af4SPeter Klausler type(t1), intent(in) :: x 4195199af4SPeter Klausler type(t3), intent(in) :: y 4295199af4SPeter Klausler eq3 = .true. 4395199af4SPeter Klausler end function 4495199af4SPeter Klausler logical function eq4(y, x) 4595199af4SPeter Klausler type(t3), intent(in) :: y 4695199af4SPeter Klausler type(t1), intent(in) :: x 4795199af4SPeter Klausler eq4 = .true. 4895199af4SPeter Klausler end function 4995199af4SPeter Klausler subroutine test2 5095199af4SPeter Klausler type(t1) :: a 5195199af4SPeter Klausler type(t2) :: b 5295199af4SPeter Klausler type(t3) :: c 5395199af4SPeter Klausler if (a == b .and. b .eq. a .and. a == c .and. c .eq. a) print *, 'ok' 5495199af4SPeter Klausler end subroutine 5595199af4SPeter Klauslerend module 5695199af4SPeter Klausler 5795199af4SPeter Klauslermodule m3 5895199af4SPeter Klausler use m2 5995199af4SPeter Klausler contains 6095199af4SPeter Klausler logical function eq5(x, y) 6195199af4SPeter Klausler type(t2), intent(in) :: x 6295199af4SPeter Klausler type(t3), intent(in) :: y 6395199af4SPeter Klausler eq5 = .true. 6495199af4SPeter Klausler end function 6595199af4SPeter Klausler logical function eq6(y, x) 6695199af4SPeter Klausler type(t3), intent(in) :: y 6795199af4SPeter Klausler type(t2), intent(in) :: x 6895199af4SPeter Klausler eq6 = .true. 6995199af4SPeter Klausler end function 7095199af4SPeter Klausler subroutine test3 7195199af4SPeter Klausler interface operator(==) 7295199af4SPeter Klausler module procedure :: eq5 7395199af4SPeter Klausler end interface 7495199af4SPeter Klausler type(t1) :: a 7595199af4SPeter Klausler type(t2) :: b 7695199af4SPeter Klausler type(t3) :: c 7795199af4SPeter Klausler if (a == b .and. b .eq. a .and. a == c .and. c .eq. a .and. b == c) print *, 'ok' 7895199af4SPeter Klausler block 7995199af4SPeter Klausler generic :: operator(.eq.) => eq6 8095199af4SPeter Klausler if (a == b .and. b .eq. a .and. a == c .and. c .eq. a .and. b == c .and. c .eq. b) print *, 'ok' 8195199af4SPeter Klausler end block 8295199af4SPeter Klausler contains 8395199af4SPeter Klausler subroutine inner 8495199af4SPeter Klausler interface operator(.eq.) 8595199af4SPeter Klausler module procedure :: eq6 8695199af4SPeter Klausler end interface 8795199af4SPeter Klausler if (a == b .and. b .eq. a .and. a == c .and. c .eq. a .and. b == c .and. c .eq. b) print *, 'ok' 8895199af4SPeter Klausler end subroutine 8995199af4SPeter Klausler end subroutine 9095199af4SPeter Klauslerend module 91