[J3] Is BIND (C [ , NAME = scalar-default-char-constant-expr ]) where scalar-default-char-constant-expr has zero length legal?
Daniel C Chen
cdchen at ca.ibm.com
Fri Jan 11 11:04:42 EST 2019
For "1. subroutine 'foo' has the BIND attribute, but no binding label. So
'foo' can be called within Fortran, but 'foo' must not be referenced in C
due to lack of a binding label. ", is based on the following wording in the
standard:
18.10.1 p4:
A reference in C to a procedure that has the BIND attribute, has the
same binding label, and is defined by means
of Fortran, causes the Fortran procedure to be invoked.
It seems it requires the Fortran procedure to have a binding label. In the
case the binding label is absent (NAME=''), such a Fortran procedure seems
cannot be referenced from C.
For 2 "If "subroutine foo() bind(c, name='')" is in an interface, Fortran
cannot call a C routine named 'foo' as well. .." is based on the following
wording in the standard:
18.10.1 p2:
If the procedure is defined by means other than Fortran,
• it shall be describable by a C prototype that is interoperable with
the interface, and
• if it is accessed using its binding label, it shall
– have a name that has external linkage as defined by 6.2.2 of ISO/IEC
9899:2011, and
– have the same binding label as the interface.
It seems referencing such a procedure requires a binding lable. In the case
the binding label is absent (NAME=''), the procedure can probably passed as
an argument but not directly referenced.
For instance, the following code seems not to be standard conforming based
on the above wording?
INTERFACE
SUBROUTINE FOO() BIND(C, NAME='')
END SUBROUTINE
END INTERFACE
CALL FOO()
END
VOID FOO() {
...
}
All of the above seems imply that NAME='' should be treated as if NAME= is
not specified but it still have a binding label that is same as the Fortran
name.
XL Fortran Development, Fortran Standard Representative
IBM Toronto Software Lab
Phone: 905-413-3056
Tie: 969-3056
Email: cdchen at ca.ibm.com
http://www.ibm.com/software/awdtools/fortran/xlfortran
From: Vipul Parekh via J3 <j3 at mailman.j3-fortran.org>
To: General J3 interest list <j3 at mailman.j3-fortran.org>
Cc: Vipul Parekh <parekhvs at gmail.com>
Date: 01/09/2019 04:02 PM
Subject: Re: [J3] Is BIND (C [ , NAME =
scalar-default-char-constant-expr ]) where
scalar-default-char-constant-expr has zero length legal?
Sent by: "J3" <j3-bounces at mailman.j3-fortran.org>
On Wed, Jan 9, 2019 at 11:27 AM Daniel C Chen via J3 <
j3 at mailman.j3-fortran.org> wrote:
..
Based on the wording in the standard that Bill pointed out,
..
2. If "subroutine foo() bind(c, name='')" is in an interface, Fortran
cannot call a C routine named 'foo' as well. ..
Re: 'If "subroutine foo() bind(c, name='')" is in an interface, Fortran
cannot call a C routine named 'foo' as well.', is it not
processor-dependent again whether Fortran can call a C routine named 'foo'.
Please see the following where on Windows x64 platform, one processor seems
to apply a Fortran procedure label which is "the same as the name of the
procedure using lower case letters" when NAME is specified with zero length
in a BIND statement. And because that labels happens to be the same as
what the companion processor does for a C function, a coder can manage to
call a C routine from Fortran, I believe this is not portable. But I
don't think the Fortran standard disallows it either.
Given this code in C:
#include <stdio.h>
void foo() {
printf("foo says Hello!\n");
}
and the Fortran code as:
module a
interface
subroutine foo() bind(C, name="")
end subroutine
end interface
end module
module b
contains
function foo() result(r)
integer :: r
r = 42
end function
end module
program p
use a
use b, bar => foo
call foo()
print *, "bar returns ", bar()
end program p
This processor allows linking a program to provide the output:
foo says Hello!
bar returns 42
My thinking is the above is conforming i.e., a module procedure by itself
is not a global identifier (if I get section 19.2 in 18-007r1 right) unlike
a module name itself. So module b above should be able to CONTAIN a
procedure named 'foo' regardless of anything in other modules. Now when
USEd in a scope such as program p with the renaming option, the global
identifiers in that scope are the interface toward subroutine foo() with
proc-lang-binding-spec but no binding label and 'bar'. The resultant code
on that platform allows invocation of C function via that processor's
convention for the Fortran procedure label and the Fortran function via the
'bar' label. Does anyone think this is incorrect?
Thanks,
Vipul[attachment "graycol.gif" deleted by Daniel C Chen/Toronto/IBM]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.j3-fortran.org/pipermail/j3/attachments/20190111/62b2f54c/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: graycol.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <https://mailman.j3-fortran.org/pipermail/j3/attachments/20190111/62b2f54c/attachment.gif>
More information about the J3
mailing list