| ! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s |
| module overrides |
| type realResult |
| real a |
| end type |
| interface operator(*) |
| procedure :: multHostDevice, multDeviceHost |
| end interface |
| interface assignment(=) |
| procedure :: assignHostResult, assignDeviceResult |
| end interface |
| contains |
| elemental function multHostDevice(x, y) result(result) |
| real, intent(in) :: x |
| real, intent(in), device :: y |
| type(realResult) result |
| result%a = x * y |
| end |
| elemental function multDeviceHost(x, y) result(result) |
| real, intent(in), device :: x |
| real, intent(in) :: y |
| type(realResult) result |
| result%a = x * y |
| end |
| elemental subroutine assignHostResult(lhs, rhs) |
| real, intent(out) :: lhs |
| type(realResult), intent(in) :: rhs |
| lhs = rhs%a |
| end |
| elemental subroutine assignDeviceResult(lhs, rhs) |
| real, intent(out), device :: lhs |
| type(realResult), intent(in) :: rhs |
| lhs = rhs%a |
| end |
| end |
| |
| program p |
| use overrides |
| real, device :: da, db |
| real :: ha, hb |
| !CHECK: CALL assigndeviceresult(db,multhostdevice(2._4,da)) |
| db = 2. * da |
| !CHECK: CALL assigndeviceresult(db,multdevicehost(da,2._4)) |
| db = da * 2. |
| !CHECK: CALL assignhostresult(ha,multhostdevice(2._4,da)) |
| ha = 2. * da |
| !CHECK: CALL assignhostresult(ha,multdevicehost(da,2._4)) |
| ha = da * 2. |
| end |