blob: 4a1027727b023eff65df2c03b79740b9bb16b4b9 [file] [edit]
! 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