(j3.2006) Abstract types, deferred bindings, generic bindings

Van Snyder van.snyder
Fri Oct 2 22:41:23 EDT 2015


On Fri, 2015-10-02 at 21:43 -0400, Rafik Zurob wrote:
> I think it is sufficient to have generic binding S only in type A in this 
> case.
> 
> > If it's only in the parent type, and I have a variable V of type (not
> > class) B, can I reference V%S?
> 
> I don't see why not.  It's the same as referencing V%S_d or V%S_a.

It's supposed to reference V%S_d_2 or V%S_s_2 via V%S, but if there's no
GENERIC statement in type B, are the bindings to S_d in both types parts
of the same generic?

> > If it's only in the extensions, and I have a variable W of class(a), can
> > I reference W%S?
> 
> No.  S would not be part of type A.  You would need SELECT TYPE with a 
> type guard that gives you access to type B.
> 
> > Is the "generic" statement allowed in both type definitions? (One of my
> > compilers says that's ambiguous.)
> 
> The two generic statements in type A and its extension are specifying the 
> same specific bindings.  So you can reduce the problem to whether you can 
> repeat a specific binding name in the a generic binding or not.  i.e. The 
> same issue can occur without type extension:

They're specifying bindings that have the same identifiers in different
types, but in type(a) they're bound to the abstract S_d and S_s
subroutines, while in type(b) they're bound to the concrete S_d_2 and
S_s_2 subroutines.  The passed-object dummy arguments of S_d and S_d_2
are TKR compatible, which I assume is the problem.

> type Mytype
> contains
>   procedure foo
>   generic :: g => foo, foo  ! error?
> end type
> 
> Section 12.4.3.5.5 says: "C1220 Within the scope of a generic name, each 
> pair of procedures identified by that name shall both ...".  If you read 
> "each pair of procedures" to mean each pair of procedure *names* appearing 
> in the generic interface, then you have to apply the rules in 12.4.3.5.5 
> to the pair (foo, foo) and it will be found ambiguous.  If, however, you 
> read "each pair of procedures" to mean each pair of [unique] procedures, 
> then the interface is unambiguous.  Interp F03/0018 clarified that the 
> latter is the intended approach.  i.e. Generic bindings can have duplicate 
> specific procedure names.
> 
> For what it's worth, XLF accepts your example, if I remove the :: from 
> "module :: M".
> 
> Regards
> 
> Rafik
> 
> j3-bounces at mailman.j3-fortran.org wrote on 02/10/2015 08:12:59 PM:
> 
> > From: Van Snyder <Van.Snyder at jpl.nasa.gov>
> > To: j3 <j3 at j3-fortran.org>
> > Date: 02/10/2015 08:13 PM
> > Subject: (j3.2006) Abstract types, deferred bindings, generic bindings
> > Sent by: j3-bounces at mailman.j3-fortran.org
> > 
> > Consider such a module:
> > 
> > module :: M
> > 
> >   type, abstract :: A(rk)
> >     integer, kind :: RK
> >   contains
> >     procedure(s_d), deferred :: S_d
> >     procedure(s_s), deferred :: S_s
> >     generic :: S => s_d, s_s
> >   end type A
> > 
> >   type, extends(a) :: B
> >   contains
> >     procedure :: S_d => s_d_2
> >     procedure :: S_s => s_s_2
> >     generic :: S => s_d, s_s
> >   end type B
> > 
> >   abstract interface
> >     subroutine S_d ( X )
> >       import
> >       integer, parameter :: RK = kind(0.0d0)
> >       class(a(rk)), intent(inout) :: X
> >     end subroutine S_d
> >     subroutine S_s ( X )
> >       import
> >       integer, parameter :: RK = kind(0.0e0)
> >       class(a(rk)), intent(inout) :: X
> >     end subroutine S_s
> >   end interface
> > 
> > contains
> > 
> >     subroutine S_d_2 ( X )
> >       integer, parameter :: RK = kind(0.0d0)
> >       class(b(rk)), intent(inout) :: X
> >     end subroutine S_d_2
> >     subroutine S_s_2 ( X )
> >       integer, parameter :: RK = kind(0.0e0)
> >       class(b(rk)), intent(inout) :: X
> >     end subroutine S_s_2
> > 
> > end module M
> > 
> > Is the "generic" statement allowed in both type definitions? (One of my
> > compilers says that's ambiguous.)
> > 
> > If not, should it be in the parent type, or each extension?
> > 
> > If it's only in the parent type, and I have a variable V of type (not
> > class) B, can I reference V%S?
> > 
> > If it's only in the extensions, and I have a variable W of class(a), can
> > I reference W%S?
> > 
> > I would have preferred that we hadn't required the interface-name on the
> > procedure statement with the deferred attribute if the binding-name is
> > the name of an accessible abstract interface, i.e., if C482 were instead
> > 
> > C482 (R452) If DEFERRED appears and <binding-name> is not the name of an
> >      abstract interface [or a procedure that has an explicit
> >      interface]?, <interface-name> shall appear.
> > 
> > 
> > _______________________________________________
> > J3 mailing list
> > J3 at mailman.j3-fortran.org
> > http://mailman.j3-fortran.org/mailman/listinfo/j3
> > 
> 
> 





More information about the J3 mailing list