xref: /llvm-project/flang/test/Semantics/resolve110.f90 (revision 32332909f45b55aba4cfa7fac95e28cd174655f5)
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