| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Tests module procedures declared and defined in the same module. |
| |
| ! These cases are correct. |
| module m1 |
| interface |
| integer module function f1(x) |
| real, intent(in) :: x |
| end function |
| integer module function f2(x) |
| real, intent(in) :: x |
| end function |
| module function f3(x) result(res) |
| integer :: res |
| real, intent(in) :: x |
| end function |
| module function f4(x) result(res) |
| integer :: res |
| real, intent(in) :: x |
| end function |
| module subroutine s1 |
| end subroutine |
| pure module subroutine s2 |
| end subroutine |
| module subroutine s3 |
| end subroutine |
| end interface |
| contains |
| integer module function f1(x) |
| real, intent(in) :: x |
| f1 = x |
| end function |
| module procedure f2 |
| f2 = x |
| end procedure |
| module function f3(x) result(res) |
| integer :: res |
| real, intent(in) :: x |
| res = x |
| end function |
| module procedure f4 |
| res = x |
| end procedure |
| module subroutine s1 |
| end subroutine |
| pure module subroutine s2 |
| end subroutine |
| module procedure s3 |
| end procedure |
| end module |
| |
| ! Error cases |
| |
| module m2 |
| interface |
| integer module function f1(x) |
| real, intent(in) :: x |
| end function |
| integer module function f2(x) |
| real, intent(in) :: x |
| end function |
| module function f3(x) result(res) |
| integer :: res |
| real, intent(in) :: x |
| end function |
| module function f4(x) result(res) |
| integer :: res |
| real, intent(in) :: x |
| end function |
| module subroutine s1 |
| end subroutine |
| pure module subroutine s2 |
| end subroutine |
| end interface |
| contains |
| integer module function f1(x) |
| !ERROR: Dummy argument 'x' has type INTEGER(4); the corresponding argument in the interface body has distinct type REAL(4) |
| integer, intent(in) :: x |
| f1 = x |
| end function |
| !ERROR: 'notf2' was not declared a separate module procedure |
| module procedure notf2 |
| end procedure |
| !ERROR: Result of function 'f3' is not compatible with the result of the corresponding interface body: function results have distinct types: REAL(4) vs INTEGER(4) |
| module function f3(x) result(res) |
| real :: res |
| real, intent(in) :: x |
| res = x |
| end function |
| !ERROR: Module subroutine 'f4' was declared as a function in the corresponding interface body |
| module subroutine f4 |
| end subroutine |
| !ERROR: Module function 's1' was declared as a subroutine in the corresponding interface body |
| module function s1 |
| end function |
| !ERROR: Module subprogram 's2' and its corresponding interface body are not both PURE |
| impure module subroutine s2 |
| end subroutine |
| end module |