Skip to content

Commit

Permalink
[flang] Check for BIND(C) through use association.
Browse files Browse the repository at this point in the history
If the interface specifies BIND(C), then the declarations using
this interface inherit BIND(C), and if they are referenced via use
association they must be classified as BIND(C) subprograms.

Differential Revision: https://reviews.llvm.org/D145084
  • Loading branch information
vzakhari committed Mar 1, 2023
1 parent dafeb97 commit d80a29a
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
3 changes: 2 additions & 1 deletion flang/lib/Semantics/tools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,8 @@ bool IsPointerDummy(const Symbol &symbol) {
return IsPointer(symbol) && IsDummy(symbol);
}

bool IsBindCProcedure(const Symbol &symbol) {
bool IsBindCProcedure(const Symbol &original) {
const Symbol &symbol{original.GetUltimate()};
if (const auto *procDetails{symbol.detailsIf<ProcEntityDetails>()}) {
if (procDetails->procInterface()) {
// procedure component with a BIND(C) interface
Expand Down
56 changes: 56 additions & 0 deletions flang/test/Lower/bindc_procs.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
! RUN: bbc -emit-fir %s -o - | FileCheck %s

! CHECK-DAG: func.func private @proc1() attributes {fir.bindc_name = "proc1"}
module decl1
interface
subroutine proc_iface() bind(C)
end subroutine proc_iface
end interface
procedure (proc_iface) PrOc1
end module decl1
subroutine test1(x)
use decl1
call PrOc1
end subroutine test1

! CHECK-DAG: func.func private @proc2() attributes {fir.bindc_name = "proc2"}
module decl2
interface
subroutine proc_iface() bind(C)
end subroutine proc_iface
end interface
end module decl2
subroutine test2(x)
use decl2
procedure (proc_iface) PrOc2
call PrOc2
end subroutine test2

! CHECK-DAG: func.func private @func3() -> f32 attributes {fir.bindc_name = "func3"}
module decl3
interface
real function func_iface() bind(C)
end function func_iface
end interface
procedure (func_iface) FuNc3
end module decl3
subroutine test3(x)
use decl3
real :: x
x = FuNc3()
end subroutine test3

! CHECK-DAG: func.func private @func4() -> f32 attributes {fir.bindc_name = "func4"}
module decl4
interface
real function func_iface() bind(C)
end function func_iface
end interface
end module decl4
subroutine test4(x)
use decl4
procedure (func_iface) FuNc4
real :: x
x = FuNc4()
end subroutine test4

0 comments on commit d80a29a

Please sign in to comment.