! RUN: %f18 -funparse %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