(j3.2006) Interp request for GENERIC
Tom Clune
Thomas.L.Clune
Fri Mar 4 00:19:54 EST 2011
Jim,
On Mar 3, 2011, at 11:13 PM, Jim Xia wrote:
>
> There is a typo in your code: procedure :: base_r8 !
> shouldn't this be base_r?
Yes - sorry I cleaned up the example in haste. The one my colleague
created used "real*8", and I hated to submit a non-standard conforming
example. I should have checked it more thoroughly. Sorry about that.
>
> A generic call is resolved to a specific binding name at compile
> time and bound to a specific procedure at runtime. So bar%proc(i)
> and bar%proc(x) are resolved to as if calling bar%base_i(i) and bar
> %base_r(x) respectively at compile time. The actual procedures are
> invoked are dependent on the dynamic type of the designator -- in
> this case a Child type. So the actual procedures called are child_i
> and child_r. The intuitive sense is correct :-)
Thanks for the confirmation. I've already submitted a bug report to
the relevant unnamed vendor.
Cheers,
- Tom
>
> Cheers,
>
> Jim Xia
>
> Compiler Testing, X10 & XLF
> IBM Toronto Lab at 8200 Warden Ave,
> Markham, On, L6G 1C7
> 905-413-3444
>
>
>
> From: Tom Clune <Thomas.L.Clune at nasa.gov>
> To: fortran standards email list for J3 <j3 at j3-fortran.org>
> Date: 03/03/2011 10:54 PM
> Subject: (j3.2006) Interp request for GENERIC
>
>
>
>
> In the sample code below there are two derived types defined - Base
> and Child, which EXTEND's Base. Base defines a GENERIC with two
> type-
> bound procedures, and Child overrides those type bound procedures. On
> two compilers, when the generic is invoked on an object of type child,
> the Child's type-bound procedures are invoked, while one other the
> parent's are invoked. The former makes more intuitive sense. The
> statements on the subject in the extant F2003 books left me more
> confused on this issue.
>
> module ClassMod
> implicit none
>
> type Base
> contains
> procedure :: base_i
> procedure :: base_r8
> generic :: proc => base_i, base_r
> end type Base
>
> type, extends(Base) :: Child
> integer :: i
> real :: x
> contains
> procedure :: base_i => child_i
> procedure :: base_r => child_r
> end type Child
>
> contains
>
> subroutine base_i(this,i)
> class(Base) :: this
> integer :: i
> write(6,*) 'executed base_i'
> end subroutine base_i
>
> subroutine base_r(this,x)
> class(Base) :: this
> real :: x
> write(6,*) 'executed base_r'
> end subroutine base_r
>
> subroutine child_i(this,i)
> class(Child) :: this
> integer :: i
> this%i = i
> write(6,*) 'executed child_i'
> end subroutine child_i
>
> subroutine child_r(this,x)
> class(Child) :: this
> real :: x
> this%x = x
> write(6,*) 'executed child_r'
> end subroutine child_r
>
> end module ClassMod
>
> program tryit
> use ClassMod
> implicit none
> integer :: i
> real :: x
> type(Base) :: foo
> type(Child) :: bar
> i = 5
> x = 20e0
> write(6,*) 'calling Base:'
> call foo%proc(i)
> call foo%proc(x)
> write(6,*) 'calling actual procedures:'
> call bar%proc(i)
> call bar%proc(x)
> end program tryit
>
>
>
> Thanks in advance,
>
> - Tom
>
> Thomas Clune
> Software Integration and Visualization Office
> NASA GSFC (610.3)
> 301-286-4635 (W) 301-286-1775 (F)
> <Thomas.L.Clune at nasa.gov>
>
>
>
>
>
>
> _______________________________________________
> J3 mailing list
> J3 at j3-fortran.org
> http://j3-fortran.org/mailman/listinfo/j3
>
>
> <ATT00001.txt>
Thomas Clune
Software Integration and Visualization Office
NASA GSFC (610.3)
301-286-4635 (W) 301-286-1775 (F)
<Thomas.L.Clune at nasa.gov>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://j3-fortran.org/pipermail/j3/attachments/20110304/eb341195/attachment-0001.htm>
More information about the J3
mailing list