1. Deal with BIND(C,NAME="") BIND(C,NAME="") is different from BIND(C). The latter implies that there us a binding label which is the Fortran symbol name (no Fortran mangling must be added like underscores). The former implies there is no binding label (the name in the object file must be the same as if it there was no BIND(C) attribute at all). This is correctly implemented in the front-end, but lowering mistakenly overrode this in the code dealing with the case where BIND(C) is inherited from a procedure interface. Handling of this last case is moved into name resolution. 2. Deal with BIND(C) internal procedure Also according to 18.10.2, BIND(C) does not give a p prevent name resolution from adding a label to them, otherwise, bindc_internal_proc.f90 was not going through semantics (bogus error about conflicting global names). Nothing TODO in lowering other than removing the TODO.
70 lines
2.5 KiB
Fortran
70 lines
2.5 KiB
Fortran
! Test mangling with BIND(C) inherited from procedure interface.
|
|
! RUN: bbc -emit-hlfir -o - %s | FileCheck %s
|
|
|
|
subroutine test()
|
|
interface
|
|
subroutine iface_notbindc()
|
|
end subroutine
|
|
subroutine iface_bindc() bind(c)
|
|
end subroutine
|
|
subroutine iface_explicit_name() bind(c, name="explicit_name")
|
|
end subroutine
|
|
subroutine iface_nobinding() bind(c, name="")
|
|
end subroutine
|
|
end interface
|
|
|
|
procedure(iface_bindc) :: foo_iface_bindc
|
|
procedure(iface_explicit_name) :: foo_iface_explicit_name
|
|
procedure(iface_nobinding) :: foo_iface_nobinding
|
|
|
|
procedure(iface_bindc), bind(c) :: extra_bindc_iface_bindc
|
|
procedure(iface_explicit_name), bind(c) :: extra_bindc_iface_explicit_name
|
|
procedure(iface_nobinding), bind(c) :: extra_bindc_iface_nobinding
|
|
|
|
procedure(iface_bindc), bind(c, name="bar_iface_bindc_2") :: bar_iface_bindc
|
|
procedure(iface_explicit_name), bind(c,name="bar_iface_explicit_name_2") :: bar_iface_explicit_name
|
|
procedure(iface_nobinding), bind(c, name="bar_iface_nobinding_2") :: bar_iface_nobinding
|
|
|
|
procedure(iface_bindc), bind(c, name="") :: nobinding_iface_bindc
|
|
procedure(iface_explicit_name), bind(c, name="") :: nobinding_iface_explicit_name
|
|
procedure(iface_nobinding), bind(c, name="") :: nobinding_iface_nobinding
|
|
|
|
call iface_notbindc()
|
|
call iface_bindc()
|
|
call iface_explicit_name()
|
|
call iface_nobinding()
|
|
|
|
call foo_iface_bindc()
|
|
call foo_iface_explicit_name()
|
|
call foo_iface_nobinding()
|
|
|
|
call extra_bindc_iface_bindc()
|
|
call extra_bindc_iface_explicit_name()
|
|
call extra_bindc_iface_nobinding()
|
|
|
|
call bar_iface_bindc()
|
|
call bar_iface_explicit_name()
|
|
call bar_iface_nobinding()
|
|
|
|
call nobinding_iface_bindc()
|
|
call nobinding_iface_explicit_name()
|
|
call nobinding_iface_nobinding()
|
|
|
|
! CHECK: fir.call @_QPiface_notbindc()
|
|
! CHECK: fir.call @iface_bindc()
|
|
! CHECK: fir.call @explicit_name()
|
|
! CHECK: fir.call @_QPiface_nobinding()
|
|
! CHECK: fir.call @foo_iface_bindc()
|
|
! CHECK: fir.call @foo_iface_explicit_name()
|
|
! CHECK: fir.call @foo_iface_nobinding()
|
|
! CHECK: fir.call @extra_bindc_iface_bindc()
|
|
! CHECK: fir.call @extra_bindc_iface_explicit_name()
|
|
! CHECK: fir.call @extra_bindc_iface_nobinding()
|
|
! CHECK: fir.call @bar_iface_bindc_2()
|
|
! CHECK: fir.call @bar_iface_explicit_name_2()
|
|
! CHECK: fir.call @bar_iface_nobinding_2()
|
|
! CHECK: fir.call @_QPnobinding_iface_bindc()
|
|
! CHECK: fir.call @_QPnobinding_iface_explicit_name()
|
|
! CHECK: fir.call @_QPnobinding_iface_nobinding()
|
|
end subroutine
|