| ! Test accepted SIMPLE procedure cases. |
| ! RUN: %flang_fc1 -fsyntax-only %s |
| |
| ! SIMPLE procedures satisfy PURE requirements. |
| module simple_satisfies_pure |
| implicit none |
| abstract interface |
| pure integer function pure_iface(x) |
| integer, intent(in) :: x |
| end function |
| end interface |
| contains |
| simple integer function simple_impl(x) |
| integer, intent(in) :: x |
| simple_impl = x |
| end function |
| |
| pure integer function apply_requires_pure(f, x) |
| procedure(pure_iface) :: f |
| integer, intent(in) :: x |
| apply_requires_pure = f(x) |
| end function |
| |
| integer function test() |
| test = apply_requires_pure(simple_impl, 1) |
| end function |
| end module |
| |
| ! Use-associated SIMPLE procedures are recognized. |
| module simple_use_assoc_m |
| contains |
| simple subroutine s() |
| end subroutine |
| end module |
| |
| program simple_use_assoc_p |
| use simple_use_assoc_m |
| implicit none |
| call needs_simple(s) |
| contains |
| subroutine needs_simple(p) |
| abstract interface |
| simple subroutine simple_proc() |
| end subroutine |
| end interface |
| procedure(simple_proc) :: p |
| end subroutine |
| end program |
| |
| ! SIMPLE functions returning non-trivial CHARACTER results. |
| module simple_character_result |
| contains |
| simple function fixed_len_character() result(res) |
| character(len=5) :: res |
| res = "hello" |
| end function |
| |
| simple function dependent_len_character(x) result(res) |
| character(*), intent(in) :: x |
| character(len=len(x)) :: res |
| res = x |
| end function |
| |
| subroutine test() |
| character(len=3) :: a |
| character(len=7) :: b |
| a = dependent_len_character("abc") |
| b = dependent_len_character("testing") |
| end subroutine |
| end module |
| |
| ! SIMPLE and PURE may both appear in either order. |
| module simple_pure_order |
| contains |
| simple pure subroutine simple_pure_sub() |
| end subroutine |
| |
| pure simple subroutine pure_simple_sub() |
| end subroutine |
| |
| subroutine test() |
| call simple_pure_sub() |
| call pure_simple_sub() |
| end subroutine |
| end module |
| |
| ! SIMPLE separate module function is accepted. |
| module m_smf |
| interface |
| simple module function f(x) result(res) |
| integer, intent(in) :: x |
| integer :: res |
| end function |
| end interface |
| end module |
| |
| submodule(m_smf) sm_smf |
| contains |
| module procedure f |
| res = x |
| end procedure |
| end submodule |
| |
| ! MODULE SIMPLE function prefix order is accepted. |
| module m_msf |
| interface |
| module simple function g(x) result(res) |
| integer, intent(in) :: x |
| integer :: res |
| end function |
| end interface |
| end module |
| |
| submodule(m_msf) sm_msf |
| contains |
| module procedure g |
| res = x |
| end procedure |
| end submodule |