J3/04-406
Date: 12 October 2004
To: J3
From: Van Snyder
Subject: Interpretation request on generic interface blocks
Reference: J3/04-405
NUMBER: TBD
TITLE: Multiple identical specific procedures in generic interface blocks
KEYWORDS: Type-bound generics
DEFECT TYPE: Error
STATUS:
QUESTION 1:
Does the following program conform to the 2003 standard?
program P
interface X
subroutine S ( A )
integer :: A
end subroutine S
procedure S
end interface X
end program P
ANALYSIS:
16.2.3 (Restrictions on generic declarations) specifies that it "contains
the rules that shall be satisfied by every pair of specific procedures
that have the same generic identifier within a scoping unit."
It is not clear whether the interface body and the procedure statement
bind separate specific procedures to the generic identifier, or only
redundantly bind the same procedure. If the former, the program is not
standard conforming because it violates the provisions of 16.2.3. If the
latter, it appears to be standard conforming.
C1209 (in 12.3.2.1) prohibits a procedure to be bound to a generic
interface more than once in a scoping unit, but only by way of a
PROCEDURE statement in a generic interface block.
There is a general rule that nothing shall be declared more than once. It
appears that a procedure statement within an interface block is not a
declaration: 5.1.2.6 (External attribute) specifies that the external
attribute may be specified by an EXTERNAL statement, a or an interface body that is not in an abstract
interface block. A procedure statement in an interface block apparently
does not specify the external attribute. The procedure specified by the
PROCEDURE statement in the above example is clearly an external procedure
with an explicit interface, so it satisfies the requirements of C1207.
ANSWER 1:
The program does not conform to the 2003 standard. It was an oversight
that specifying the same procedure both by way of an interface body and a
procedure statement was not added to C1209. An edit is provided to
correct this oversight.
EDIT 1:
Replace C1209 and move it to be after C1202:
"C1202a (R1202) An shall not specify a procedure
that is specified previously in any accessible interface with the
same ."
ANSWER 2:
The program conforms to the 2003 standard. Multiple bindings of the same
procedure to a generic identifier using an interface body and a procedure
statement do not bind a "pair of specific procedures" to the generic
interface.
Enforcing C1209 is more bother for processors than simply allowing
multiple bindings of a particular specific procedure to a generic
interface. It is unhelpful to users, and can be hurtful if the multiple
bindings are specified by independent generic interfaces and brought into
a scoping unit by use association from different modules. There was no
equivalent constraint in Fortran 90, although something like it was added
by interp F90/000007. The constraint added there applied only to a
single specification part. It's not clear whether that meant "declared
in the same specification part" or "accessible in the same specification
part." When it was put into Fortran 95, it clearly applied to all
accessible generic interfaces with a particular . Given
the multitude of new ways to bring specific procedures into a generic
interface in Fortran 2003, and that many of those ways allow a specific
procedure to be bound to a generic identifier more than once, this
conspicuously lonely constraint should be removed. Edits are supplied to
correct this oversight.
EDIT 2:
Remove C1209 from 12.3.2.1.
Insert "distinct" before "specific" in the first sentence of 16.2.3.
SUBMITTED BY: Van Snyder
HISTORY: J3/04-406 m170 submitted