| ! { dg-do run { target fd_truncate } } |
| ! |
| ! Test the fix for PR77657 in which the DTIO subroutine was not found, |
| ! which led to an error in attempting to link to the abstract interface. |
| ! |
| ! Contributed by Damian Rouson <damian@sourceryinstitute.org> |
| ! |
| MODULE abstract_parent |
| implicit none |
| |
| type, abstract :: parent |
| contains |
| procedure(write_formatted_interface), deferred :: write_formatted |
| generic :: write(formatted) => write_formatted |
| end type parent |
| |
| abstract interface |
| subroutine write_formatted_interface(this,unit,iotype,vlist,iostat,iomsg) |
| import parent |
| class(parent), 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 |
| |
| end module |
| |
| module child_module |
| use abstract_parent, only : parent |
| implicit none |
| |
| type, extends(parent) :: child |
| integer :: i = 99 |
| contains |
| procedure :: write_formatted |
| end type |
| contains |
| subroutine write_formatted(this,unit,iotype,vlist,iostat,iomsg) |
| class(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 |
| write (unit, "(i4)") this%i |
| end subroutine |
| end module |
| |
| use child_module, only : child |
| implicit none |
| type (child) :: baby |
| integer :: v(1), istat |
| character(20) :: msg |
| open (10, status = "scratch") |
| call baby%write_formatted(10, "abcd", v, istat, msg) ! Call the dtio proc directly |
| rewind (10) |
| read (10, *) msg |
| if (trim (msg) .ne. "99") STOP 1 |
| rewind (10) |
| baby%i = 42 |
| write (10,"(DT)") baby ! Call the dtio proc via the library |
| rewind (10) |
| read (10, *) msg |
| if (trim (msg) .ne. "42") STOP 2 |
| rewind (10) |
| write (10,"(DT)") child (77) ! The original testcase |
| rewind (10) |
| read (10, *) msg |
| if (trim (msg) .ne. "77") STOP 3 |
| rewind (10) |
| write (10,40) child (77) ! Modified using format label |
| 40 format(DT) |
| rewind (10) |
| read (10, *) msg |
| if (trim (msg) .ne. "77") STOP 4 |
| close(10) |
| end |