| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Check for C1807: A procedure defined in a submodule shall not have a |
| ! binding label unless its interface is declared in the ancestor module. |
| |
| module m1 |
| implicit none |
| end module |
| |
| ! Submodule with BIND(C) procedures that have no interface in the ancestor |
| ! module - these violate C1807. |
| submodule(m1) sm1 |
| implicit none |
| contains |
| !ERROR: A procedure defined in a submodule shall not have a binding label unless its interface is declared in the ancestor module |
| subroutine sub1() bind(c) |
| end subroutine |
| !ERROR: A procedure defined in a submodule shall not have a binding label unless its interface is declared in the ancestor module |
| subroutine sub2() bind(c, name="my_sub2") |
| end subroutine |
| !ERROR: A procedure defined in a submodule shall not have a binding label unless its interface is declared in the ancestor module |
| function func1() bind(c) |
| use, intrinsic :: iso_c_binding, only: c_int |
| integer(c_int) :: func1 |
| func1 = 0 |
| end function |
| end submodule |
| |
| ! Valid: interfaces declared in ancestor module. |
| module m2 |
| implicit none |
| interface |
| module subroutine sub3() bind(c, name="sub3") |
| end subroutine |
| module function func2() bind(c) result(res) |
| use, intrinsic :: iso_c_binding, only: c_int |
| integer(c_int) :: res |
| end function |
| end interface |
| end module |
| |
| submodule(m2) sm2 |
| implicit none |
| contains |
| module subroutine sub3() bind(c, name="sub3") |
| end subroutine |
| module function func2() bind(c) result(res) |
| use, intrinsic :: iso_c_binding, only: c_int |
| integer(c_int) :: res |
| res = 0 |
| end function |
| end submodule |
| |
| ! Valid: BIND(C,NAME="") gives no binding label. |
| module m3 |
| implicit none |
| end module |
| |
| submodule(m3) sm3 |
| implicit none |
| contains |
| subroutine sub4() bind(c, name="") |
| end subroutine |
| end submodule |
| |
| ! Valid: BIND(C,NAME=" ") gives no binding label (blanks are discarded). |
| module m4 |
| implicit none |
| end module |
| |
| submodule(m4) sm4 |
| implicit none |
| contains |
| subroutine sub5() bind(c, name=" ") |
| end subroutine |
| end submodule |
| |
| ! Invalid: interface declared in a parent submodule, not the ancestor module. |
| ! C1807 requires the interface be in the ancestor module. |
| module m5 |
| implicit none |
| end module |
| |
| submodule(m5) sm5parent |
| implicit none |
| interface |
| module subroutine sub6() bind(c, name="sub6") |
| end subroutine |
| end interface |
| end submodule |
| |
| submodule(m5:sm5parent) sm5child |
| implicit none |
| contains |
| !ERROR: A procedure defined in a submodule shall not have a binding label unless its interface is declared in the ancestor module |
| module subroutine sub6() bind(c, name="sub6") |
| end subroutine |
| end submodule |
| |
| ! Valid: interface declared in the ancestor module, definition in a child |
| ! submodule - C1807 is satisfied because the interface is in the module. |
| module m6 |
| implicit none |
| interface |
| module subroutine sub7() bind(c, name="sub7") |
| end subroutine |
| end interface |
| end module |
| |
| submodule(m6) sm6parent |
| end submodule |
| |
| submodule(m6:sm6parent) sm6child |
| implicit none |
| contains |
| module subroutine sub7() bind(c, name="sub7") |
| end subroutine |
| end submodule |