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