| ! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic |
| ! Procedure pointer assignments and argument association with intrinsic functions |
| program test |
| abstract interface |
| real function realToReal(a) |
| real, intent(in) :: a |
| end function |
| real function intToReal(n) |
| integer, intent(in) :: n |
| end function |
| end interface |
| procedure(), pointer :: noInterfaceProcPtr |
| procedure(realToReal), pointer :: realToRealProcPtr |
| procedure(intToReal), pointer :: intToRealProcPtr |
| intrinsic :: float ! restricted specific intrinsic functions |
| intrinsic :: sqrt ! unrestricted specific intrinsic functions |
| external :: noInterfaceExternal |
| interface |
| elemental real function userElemental(a) |
| real, intent(in) :: a |
| end function |
| end interface |
| |
| !ERROR: 'float' is not an unrestricted specific intrinsic procedure |
| noInterfaceProcPtr => float |
| !ERROR: 'float' is not an unrestricted specific intrinsic procedure |
| intToRealProcPtr => float |
| !ERROR: 'float' is not an unrestricted specific intrinsic procedure |
| call sub1(float) |
| !ERROR: 'float' is not an unrestricted specific intrinsic procedure |
| call sub2(float) |
| !ERROR: 'float' is not an unrestricted specific intrinsic procedure |
| call sub3(float) |
| |
| noInterfaceProcPtr => sqrt ! ok |
| realToRealProcPtr => sqrt ! ok |
| !ERROR: Procedure pointer 'inttorealprocptr' associated with incompatible procedure designator 'sqrt': incompatible dummy argument #1: incompatible dummy data object types: REAL(4) vs INTEGER(4) |
| intToRealProcPtr => sqrt |
| call sub1(sqrt) ! ok |
| call sub2(sqrt) ! ok |
| !ERROR: Actual procedure argument has interface incompatible with dummy argument 'p=': incompatible dummy argument #1: incompatible dummy data object types: REAL(4) vs INTEGER(4) |
| call sub3(sqrt) |
| |
| print *, implicitExtFunc() |
| call implicitExtSubr |
| noInterfaceProcPtr => implicitExtFunc ! ok |
| noInterfaceProcPtr => implicitExtSubr ! ok |
| noInterfaceProcPtr => noInterfaceExternal ! ok |
| realToRealProcPtr => noInterfaceExternal ! ok |
| intToRealProcPtr => noInterfaceExternal !ok |
| call sub1(noInterfaceExternal) ! ok |
| !WARNING: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p=' which has an explicit interface |
| call sub2(noInterfaceExternal) |
| !WARNING: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p=' which has an explicit interface |
| call sub3(noInterfaceExternal) |
| |
| !ERROR: Procedure pointer 'nointerfaceprocptr' with implicit interface may not be associated with procedure designator 'userelemental' with explicit interface that cannot be called via an implicit interface |
| noInterfaceProcPtr => userElemental |
| !ERROR: Non-intrinsic ELEMENTAL procedure 'userelemental' may not be passed as an actual argument |
| call sub1(userElemental) |
| |
| contains |
| subroutine sub1(p) |
| external :: p |
| end subroutine |
| subroutine sub2(p) |
| procedure(realToReal) :: p |
| end subroutine |
| subroutine sub3(p) |
| procedure(intToReal) :: p |
| end subroutine |
| end |