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