| module uops |
| implicit none |
| interface operator (.foo.) |
| module procedure myfoo |
| end interface |
| |
| interface operator (*) |
| module procedure boolmul |
| end interface |
| |
| interface assignment (=) |
| module procedure int2bool |
| end interface |
| |
| contains |
| function myfoo (lhs, rhs) |
| implicit none |
| integer myfoo |
| integer, intent(in) :: lhs, rhs |
| |
| myfoo = lhs + rhs |
| end function |
| |
| ! This is deliberately different from integer multiplication |
| function boolmul (lhs, rhs) |
| implicit none |
| logical boolmul |
| logical, intent(IN) :: lhs, rhs |
| |
| boolmul = lhs .and. .not. rhs |
| end function |
| |
| subroutine int2bool (lhs, rhs) |
| implicit none |
| logical, intent(out) :: lhs |
| integer, intent(in) :: rhs |
| |
| lhs = rhs .ne. 0 |
| end subroutine |
| end module |
| |
| program me |
| use uops |
| implicit none |
| integer i, j |
| logical b, c |
| |
| b = .true. |
| c = .true. |
| if (b * c) call abort |
| c = .false. |
| if (.not. (b * c)) call abort |
| if (c * b) call abort |
| b = .false. |
| if (b * c) call abort |
| |
| i = 0 |
| b = i |
| if (b) call abort |
| i = 2 |
| b = i |
| if (.not. b) call abort |
| |
| j = 3 |
| if ((i .foo. j) .ne. 5) call abort |
| end program |
| |