xref: /llvm-project/flang/test/Semantics/modfile35.f90 (revision dc453dcf760e6d558da3a4d7fff301baa5f37aba)
1*dc453dcfSIvan Zhechev! RUN: %python %S/test_modfile.py %s %flang_fc1
264ab3302SCarolineConcattomodule m1
364ab3302SCarolineConcatto  type :: t1
464ab3302SCarolineConcatto  contains
564ab3302SCarolineConcatto    procedure, pass(x) :: p1 => f
664ab3302SCarolineConcatto    procedure, non_overridable :: p2 => f
764ab3302SCarolineConcatto    procedure, nopass :: p3 => f
864ab3302SCarolineConcatto    generic :: operator(+) => p1
964ab3302SCarolineConcatto    generic :: operator(-) => p2
1064ab3302SCarolineConcatto    generic :: operator(<) => p1
1164ab3302SCarolineConcatto    generic :: operator(.and.) => p2
1264ab3302SCarolineConcatto  end type
1364ab3302SCarolineConcattocontains
1464ab3302SCarolineConcatto  integer(8) pure function f(x, y)
1564ab3302SCarolineConcatto    class(t1), intent(in) :: x
1664ab3302SCarolineConcatto    integer, intent(in) :: y
1764ab3302SCarolineConcatto  end
1864ab3302SCarolineConcatto  ! Operators resolve to type-bound operators in t1
1964ab3302SCarolineConcatto  subroutine test1(x, y, a, b)
2064ab3302SCarolineConcatto    class(t1) :: x
2164ab3302SCarolineConcatto    integer :: y
2264ab3302SCarolineConcatto    real :: a(x + y)
2364ab3302SCarolineConcatto    real :: b(x .lt. y)
2464ab3302SCarolineConcatto  end
2564ab3302SCarolineConcatto  ! Operators resolve to type-bound operators in t1, compile-time resolvable
2664ab3302SCarolineConcatto  subroutine test2(x, y, a, b)
2764ab3302SCarolineConcatto    class(t1) :: x
2864ab3302SCarolineConcatto    integer :: y
2964ab3302SCarolineConcatto    real :: a(x - y)
3064ab3302SCarolineConcatto    real :: b(x .and. y)
3164ab3302SCarolineConcatto  end
3264ab3302SCarolineConcatto  ! Operators resolve to type-bound operators in t1, compile-time resolvable
3364ab3302SCarolineConcatto  subroutine test3(x, y, a)
3464ab3302SCarolineConcatto    type(t1) :: x
3564ab3302SCarolineConcatto    integer :: y
3664ab3302SCarolineConcatto    real :: a(x + y)
3764ab3302SCarolineConcatto  end
3864ab3302SCarolineConcattoend
3964ab3302SCarolineConcatto!Expect: m1.mod
4064ab3302SCarolineConcatto!module m1
4164ab3302SCarolineConcatto! type :: t1
4264ab3302SCarolineConcatto! contains
4364ab3302SCarolineConcatto!  procedure, pass(x) :: p1 => f
4464ab3302SCarolineConcatto!  procedure, non_overridable :: p2 => f
4564ab3302SCarolineConcatto!  procedure, nopass :: p3 => f
4664ab3302SCarolineConcatto!  generic :: operator(+) => p1
4764ab3302SCarolineConcatto!  generic :: operator(-) => p2
4864ab3302SCarolineConcatto!  generic :: operator(<) => p1
4964ab3302SCarolineConcatto!  generic :: operator(.and.) => p2
5064ab3302SCarolineConcatto! end type
5164ab3302SCarolineConcatto!contains
5264ab3302SCarolineConcatto! pure function f(x, y)
5364ab3302SCarolineConcatto!  class(t1), intent(in) :: x
5464ab3302SCarolineConcatto!  integer(4), intent(in) :: y
5564ab3302SCarolineConcatto!  integer(8) :: f
5664ab3302SCarolineConcatto! end
5764ab3302SCarolineConcatto! subroutine test1(x, y, a, b)
5864ab3302SCarolineConcatto!  class(t1) :: x
5964ab3302SCarolineConcatto!  integer(4) :: y
6064ab3302SCarolineConcatto!  real(4) :: a(1_8:x%p1(y))
6164ab3302SCarolineConcatto!  real(4) :: b(1_8:x%p1(y))
6264ab3302SCarolineConcatto! end
6364ab3302SCarolineConcatto! subroutine test2(x, y, a, b)
6464ab3302SCarolineConcatto!  class(t1) :: x
6564ab3302SCarolineConcatto!  integer(4) :: y
6664ab3302SCarolineConcatto!  real(4) :: a(1_8:f(x, y))
6764ab3302SCarolineConcatto!  real(4) :: b(1_8:f(x, y))
6864ab3302SCarolineConcatto! end
6964ab3302SCarolineConcatto! subroutine test3(x,y,a)
7064ab3302SCarolineConcatto!  type(t1) :: x
7164ab3302SCarolineConcatto!  integer(4) :: y
7264ab3302SCarolineConcatto!  real(4) :: a(1_8:f(x,y))
7364ab3302SCarolineConcatto! end
7464ab3302SCarolineConcatto!end
7564ab3302SCarolineConcatto
7664ab3302SCarolineConcattomodule m2
7764ab3302SCarolineConcatto  type :: t1
7864ab3302SCarolineConcatto  contains
7964ab3302SCarolineConcatto    procedure, pass(x) :: p1 => f1
8064ab3302SCarolineConcatto    generic :: operator(+) => p1
8164ab3302SCarolineConcatto  end type
8264ab3302SCarolineConcatto  type, extends(t1) :: t2
8364ab3302SCarolineConcatto  contains
8464ab3302SCarolineConcatto    procedure, pass(y) :: p2 => f2
8564ab3302SCarolineConcatto    generic :: operator(+) => p2
8664ab3302SCarolineConcatto  end type
8764ab3302SCarolineConcattocontains
8864ab3302SCarolineConcatto  integer(8) pure function f1(x, y)
8964ab3302SCarolineConcatto    class(t1), intent(in) :: x
9064ab3302SCarolineConcatto    integer, intent(in) :: y
9164ab3302SCarolineConcatto  end
9264ab3302SCarolineConcatto  integer(8) pure function f2(x, y)
9364ab3302SCarolineConcatto    class(t1), intent(in) :: x
9464ab3302SCarolineConcatto    class(t2), intent(in) :: y
9564ab3302SCarolineConcatto  end
9664ab3302SCarolineConcatto  subroutine test1(x, y, a)
9764ab3302SCarolineConcatto    class(t1) :: x
9864ab3302SCarolineConcatto    integer :: y
9964ab3302SCarolineConcatto    real :: a(x + y)
10064ab3302SCarolineConcatto  end
10164ab3302SCarolineConcatto  ! Resolve to operator in parent class
10264ab3302SCarolineConcatto  subroutine test2(x, y, a)
10364ab3302SCarolineConcatto    class(t2) :: x
10464ab3302SCarolineConcatto    integer :: y
10564ab3302SCarolineConcatto    real :: a(x + y)
10664ab3302SCarolineConcatto  end
10764ab3302SCarolineConcatto  ! 2nd arg is passed object
10864ab3302SCarolineConcatto  subroutine test3(x, y, a)
10964ab3302SCarolineConcatto    class(t1) :: x
11064ab3302SCarolineConcatto    class(t2) :: y
11164ab3302SCarolineConcatto    real :: a(x + y)
11264ab3302SCarolineConcatto  end
11364ab3302SCarolineConcattoend
11464ab3302SCarolineConcatto!Expect: m2.mod
11564ab3302SCarolineConcatto!module m2
11664ab3302SCarolineConcatto! type :: t1
11764ab3302SCarolineConcatto! contains
11864ab3302SCarolineConcatto!  procedure, pass(x) :: p1 => f1
11964ab3302SCarolineConcatto!  generic :: operator(+) => p1
12064ab3302SCarolineConcatto! end type
12164ab3302SCarolineConcatto! type, extends(t1) :: t2
12264ab3302SCarolineConcatto! contains
12364ab3302SCarolineConcatto!  procedure, pass(y) :: p2 => f2
12464ab3302SCarolineConcatto!  generic :: operator(+) => p2
12564ab3302SCarolineConcatto! end type
12664ab3302SCarolineConcatto!contains
12764ab3302SCarolineConcatto! pure function f1(x, y)
12864ab3302SCarolineConcatto!  class(t1), intent(in) :: x
12964ab3302SCarolineConcatto!  integer(4), intent(in) :: y
13064ab3302SCarolineConcatto!  integer(8) :: f1
13164ab3302SCarolineConcatto! end
13264ab3302SCarolineConcatto! pure function f2(x, y)
13364ab3302SCarolineConcatto!  class(t1), intent(in) :: x
13464ab3302SCarolineConcatto!  class(t2), intent(in) :: y
13564ab3302SCarolineConcatto!  integer(8) :: f2
13664ab3302SCarolineConcatto! end
13764ab3302SCarolineConcatto! subroutine test1(x, y, a)
13864ab3302SCarolineConcatto!  class(t1) :: x
13964ab3302SCarolineConcatto!  integer(4) :: y
14064ab3302SCarolineConcatto!  real(4) :: a(1_8:x%p1(y))
14164ab3302SCarolineConcatto! end
14264ab3302SCarolineConcatto! subroutine test2(x, y, a)
14364ab3302SCarolineConcatto!  class(t2) :: x
14464ab3302SCarolineConcatto!  integer(4) :: y
14564ab3302SCarolineConcatto!  real(4) :: a(1_8:x%p1(y))
14664ab3302SCarolineConcatto! end
14764ab3302SCarolineConcatto! subroutine test3(x, y, a)
14864ab3302SCarolineConcatto!  class(t1) :: x
14964ab3302SCarolineConcatto!  class(t2) :: y
15064ab3302SCarolineConcatto!  real(4) :: a(1_8:y%p2(x))
15164ab3302SCarolineConcatto! end
15264ab3302SCarolineConcatto!end
15364ab3302SCarolineConcatto
15464ab3302SCarolineConcattomodule m3
15564ab3302SCarolineConcatto  type :: t1
15664ab3302SCarolineConcatto  contains
15764ab3302SCarolineConcatto    procedure, pass(x) :: p1 => f1
15864ab3302SCarolineConcatto    procedure :: p3 => f3
15964ab3302SCarolineConcatto    generic :: operator(.binary.) => p1
16064ab3302SCarolineConcatto    generic :: operator(.unary.) => p3
16164ab3302SCarolineConcatto  end type
16264ab3302SCarolineConcatto  type, extends(t1) :: t2
16364ab3302SCarolineConcatto  contains
16464ab3302SCarolineConcatto    procedure, pass(y) :: p2 => f2
16564ab3302SCarolineConcatto    generic :: operator(.binary.) => p2
16664ab3302SCarolineConcatto  end type
16764ab3302SCarolineConcattocontains
16864ab3302SCarolineConcatto  integer(8) pure function f1(x, y)
16964ab3302SCarolineConcatto    class(t1), intent(in) :: x
17064ab3302SCarolineConcatto    integer, intent(in) :: y
17164ab3302SCarolineConcatto  end
17264ab3302SCarolineConcatto  integer(8) pure function f2(x, y)
17364ab3302SCarolineConcatto    class(t1), intent(in) :: x
17464ab3302SCarolineConcatto    class(t2), intent(in) :: y
17564ab3302SCarolineConcatto  end
17664ab3302SCarolineConcatto  integer(8) pure function f3(x)
17764ab3302SCarolineConcatto    class(t1), intent(in) :: x
17864ab3302SCarolineConcatto  end
17964ab3302SCarolineConcatto  subroutine test1(x, y, a)
18064ab3302SCarolineConcatto    class(t1) :: x
18164ab3302SCarolineConcatto    integer :: y
18264ab3302SCarolineConcatto    real :: a(x .binary. y)
18364ab3302SCarolineConcatto  end
18464ab3302SCarolineConcatto  ! Resolve to operator in parent class
18564ab3302SCarolineConcatto  subroutine test2(x, y, a)
18664ab3302SCarolineConcatto    class(t2) :: x
18764ab3302SCarolineConcatto    integer :: y
18864ab3302SCarolineConcatto    real :: a(x .binary. y)
18964ab3302SCarolineConcatto  end
19064ab3302SCarolineConcatto  ! 2nd arg is passed object
19164ab3302SCarolineConcatto  subroutine test3(x, y, a)
19264ab3302SCarolineConcatto    class(t1) :: x
19364ab3302SCarolineConcatto    class(t2) :: y
19464ab3302SCarolineConcatto    real :: a(x .binary. y)
19564ab3302SCarolineConcatto  end
19664ab3302SCarolineConcatto  subroutine test4(x, y, a)
19764ab3302SCarolineConcatto    class(t1) :: x
19864ab3302SCarolineConcatto    class(t2) :: y
19964ab3302SCarolineConcatto    real :: a(.unary. x + .unary. y)
20064ab3302SCarolineConcatto  end
20164ab3302SCarolineConcattoend
20264ab3302SCarolineConcatto!Expect: m3.mod
20364ab3302SCarolineConcatto!module m3
20464ab3302SCarolineConcatto!  type::t1
20564ab3302SCarolineConcatto!  contains
20664ab3302SCarolineConcatto!    procedure,pass(x)::p1=>f1
20764ab3302SCarolineConcatto!    procedure::p3=>f3
2084864d9f7Speter klausler!    generic::operator(.binary.)=>p1
2094864d9f7Speter klausler!    generic::operator(.unary.)=>p3
21064ab3302SCarolineConcatto!  end type
21164ab3302SCarolineConcatto!  type,extends(t1)::t2
21264ab3302SCarolineConcatto!  contains
21364ab3302SCarolineConcatto!    procedure,pass(y)::p2=>f2
2144864d9f7Speter klausler!    generic::operator(.binary.)=>p2
21564ab3302SCarolineConcatto!  end type
21664ab3302SCarolineConcatto!contains
21764ab3302SCarolineConcatto!  pure function f1(x,y)
21864ab3302SCarolineConcatto!    class(t1),intent(in)::x
21964ab3302SCarolineConcatto!    integer(4),intent(in)::y
22064ab3302SCarolineConcatto!    integer(8)::f1
22164ab3302SCarolineConcatto!  end
22264ab3302SCarolineConcatto!  pure function f2(x,y)
22364ab3302SCarolineConcatto!    class(t1),intent(in)::x
22464ab3302SCarolineConcatto!    class(t2),intent(in)::y
22564ab3302SCarolineConcatto!    integer(8)::f2
22664ab3302SCarolineConcatto!  end
22764ab3302SCarolineConcatto!  pure function f3(x)
22864ab3302SCarolineConcatto!    class(t1),intent(in)::x
22964ab3302SCarolineConcatto!    integer(8)::f3
23064ab3302SCarolineConcatto!  end
23164ab3302SCarolineConcatto!  subroutine test1(x,y,a)
23264ab3302SCarolineConcatto!    class(t1)::x
23364ab3302SCarolineConcatto!    integer(4)::y
23464ab3302SCarolineConcatto!    real(4)::a(1_8:x%p1(y))
23564ab3302SCarolineConcatto!  end
23664ab3302SCarolineConcatto!  subroutine test2(x,y,a)
23764ab3302SCarolineConcatto!    class(t2)::x
23864ab3302SCarolineConcatto!    integer(4)::y
23964ab3302SCarolineConcatto!    real(4)::a(1_8:x%p1(y))
24064ab3302SCarolineConcatto!  end
24164ab3302SCarolineConcatto!  subroutine test3(x,y,a)
24264ab3302SCarolineConcatto!    class(t1)::x
24364ab3302SCarolineConcatto!    class(t2)::y
24464ab3302SCarolineConcatto!    real(4)::a(1_8:y%p2(x))
24564ab3302SCarolineConcatto!  end
24664ab3302SCarolineConcatto!  subroutine test4(x,y,a)
24764ab3302SCarolineConcatto!    class(t1)::x
24864ab3302SCarolineConcatto!    class(t2)::y
24964ab3302SCarolineConcatto!    real(4)::a(1_8:x%p3()+y%p3())
25064ab3302SCarolineConcatto!  end
25164ab3302SCarolineConcatto!end
252