! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s | |
! Check the analyzed form of a defined operator or assignment. | |
! Type-bound defined assignment | |
module m1 | |
type :: t | |
contains | |
procedure :: b1 => s1 | |
procedure, pass(y) :: b2 => s2 | |
generic :: assignment(=) => b1, b2 | |
end type | |
contains | |
subroutine s1(x, y) | |
class(t), intent(out) :: x | |
integer, intent(in) :: y | |
end | |
subroutine s2(x, y) | |
real, intent(out) :: x | |
class(t), intent(in) :: y | |
end | |
subroutine test1(x) | |
type(t) :: x | |
real :: a | |
!CHECK: CALL s1(x,1_4) | |
x = 1 | |
!CHECK: CALL s2(a,x) | |
a = x | |
end | |
subroutine test2(x) | |
class(t) :: x | |
real :: a | |
!CHECK: CALL x%b1(1_4) | |
x = 1 | |
!CHECK: CALL x%b2(a) | |
a = x | |
end | |
end | |
! Type-bound operator | |
module m2 | |
type :: t2 | |
contains | |
procedure, pass(x2) :: b2 => f | |
generic :: operator(+) => b2 | |
end type | |
contains | |
integer pure function f(x1, x2) | |
class(t2), intent(in) :: x1 | |
class(t2), intent(in) :: x2 | |
end | |
subroutine test2(x, y) | |
class(t2) :: x | |
type(t2) :: y | |
!CHECK: i=f(x,y) | |
i = x + y | |
!CHECK: i=x%b2(y) | |
i = y + x | |
end | |
end module | |
! Non-type-bound assignment and operator | |
module m3 | |
type t | |
end type | |
interface assignment(=) | |
subroutine s1(x, y) | |
import | |
class(t), intent(out) :: x | |
integer, intent(in) :: y | |
end | |
end interface | |
interface operator(+) | |
integer function f(x, y) | |
import | |
class(t), intent(in) :: x, y | |
end | |
end interface | |
contains | |
subroutine test(x, y) | |
class(t) :: x, y | |
!CHECK: CALL s1(x,2_4) | |
x = 2 | |
!CHECK: i=f(x,y) | |
i = x + y | |
end | |
end | |