| ! { dg-do run } |
| ! |
| ! PR78737: [OOP] linking error with deferred, undefined user-defined derived-type I/O |
| ! |
| ! Contributed by Damian Rouson <damian@sourceryinstitute.org> |
| |
| module object_interface |
| character(30) :: buffer(2) |
| 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_child1 |
| integer :: i |
| contains |
| procedure :: write_formatted => write_formatted1 |
| end type |
| type, extends(object) :: non_abstract_child2 |
| real :: r |
| contains |
| procedure :: write_formatted => write_formatted2 |
| end type |
| contains |
| subroutine write_formatted1(this,unit,iotype,vlist,iostat,iomsg) |
| class(non_abstract_child1), 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 |
| write(unit,'(a,i2/)') "write_formatted1 => ", this%i |
| end subroutine |
| subroutine write_formatted2(this,unit,iotype,vlist,iostat,iomsg) |
| class(non_abstract_child2), 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 |
| write(unit,'(a,f4.1/)') "write_formatted2 => ", this%r |
| end subroutine |
| subroutine assert(a) |
| class(object):: a |
| write(buffer,'(DT)') a |
| end subroutine |
| end module |
| |
| program p |
| use object_interface |
| |
| call assert (non_abstract_child1 (99)) |
| if (trim (buffer(1)) .ne. "write_formatted1 => 99") STOP 1 |
| |
| call assert (non_abstract_child2 (42.0)) |
| if (trim (buffer(1)) .ne. "write_formatted2 => 42.0") STOP 2 |
| end |