[Bug fortran/78737] [OOP] linking error with deferred, undefined user-defined derived-type I/O
pault at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Dec 12 14:04:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78737
--- Comment #16 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to Paul Thomas from comment #15)
> (In reply to Damian Rouson from comment #14)
> > Hi Paul,
> >
> > Based on comment #12, I assume you no longer believe that type guarding is
> > required. If I misinterpreted comment #12, please let me know. Otherwise,
> > please let me know what in the standard indicates that type guarding is
> > required. I too would be surprised.
>
> Dear Damian and Janus,
>
> What I meant is that we did not implement dynamic dispatch of the dtio
> procedures. In the corrected testcase of comments #12 and #13, where the
> first argument of write_formatted has declared type 'object', it is
> necessary to use type guarding within write_formatted to obtain the
> appropriate IO.
>
> I have to confess that this "interpretation" is arrived at by the absence of
> any mention of the need for dynamic dispatch and by the implementation by
> other vendors.
>
> See this further example, which works with the last version of the patch.
>
> module object_interface
> type, abstract :: object
> contains
> procedure(write_formatted_interface), deferred :: write_formatted
> generic :: write(formatted) => write_formatted
> end type
> abstract interface
> subroutine write_formatted_interface(this,unit,iotype,vlist,iostat,iomsg)
> import object
> class(object), intent(in) :: this
> integer, intent(in) :: unit
> character (len=*), intent(in) :: iotype
> integer, intent(in) :: vlist(:)
> integer, intent(out) :: iostat
> character (len=*), intent(inout) :: iomsg
> end subroutine
> end interface
> type, extends(object) :: non_abstract_child
> integer :: i
> contains
> procedure :: write_formatted => write_formatted2
> end type
> contains
> subroutine write_formatted(this,unit,iotype,vlist,iostat,iomsg)
> class(object), intent(in) :: this
> integer, intent(in) :: unit
> character (len=*), intent(in) :: iotype
> integer, intent(in) :: vlist(:)
> integer, intent(out) :: iostat
> character (len=*), intent(inout) :: iomsg
> select type (this)
> class is (non_abstract_child)
> print '(a,i4/)', "write_formatted => ", this%i
> print *, this
> class default
> print *, "Error"
> end select
> end subroutine
> subroutine write_formatted2(this,unit,iotype,vlist,iostat,iomsg)
> class(non_abstract_child), intent(in) :: this
> integer, intent(in) :: unit
> character (len=*), intent(in) :: iotype
> integer, intent(in) :: vlist(:)
> integer, intent(out) :: iostat
> character (len=*), intent(inout) :: iomsg
> print '(a,i4/)', "write_formatted2 => ", this%i
> end subroutine
> subroutine assert(a)
> class(object):: a
> write(*,*) a
> end subroutine
> end module
>
> use object_interface
> class (object), allocatable :: z
> allocate (z, source = non_abstract_child (99))
> call assert (z)
> end
>
> Is this now OK?
>
> Paul
On thinking about it, is the specific instance of write_formatted allowed? it
is easily forbidden, if not.
Cheers
Paul
More information about the Gcc-bugs
mailing list