! { dg-do run } ! PR78881 test for correct end of record condition and ignoring advance= module t_m use, intrinsic :: iso_fortran_env, only : iostat_end, iostat_eor, output_unit implicit none type, public :: t character(len=:), allocatable :: m_s contains procedure, pass(this) :: read_t generic :: read(formatted) => read_t end type t contains subroutine read_t(this, lun, iotype, vlist, istat, imsg) class(t), intent(inout) :: this integer, intent(in) :: lun character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: istat character(len=*), intent(inout) :: imsg character(len=1) :: c integer :: i i = 0 ; imsg='' loop_read: do i = i + 1 read( unit=lun, fmt='(a1)', iostat=istat, iomsg=imsg) c select case ( istat ) case ( 0 ) if (i.eq.1 .and. c.ne.'h') exit loop_read !write( output_unit, fmt=sfmt) "i = ", i, ", c = ", c case ( iostat_end ) !write( output_unit, fmt=sfmt) "i = ", i, ", istat = iostat_end" exit loop_read case ( iostat_eor ) !write( output_unit, fmt=sfmt) "i = ", i, ", istat = iostat_eor" exit loop_read case default !write( output_unit, fmt=sfmt) "i = ", i, ", istat = ", istat exit loop_read end select if (i.gt.10) exit loop_read end do loop_read end subroutine read_t end module t_m program p use t_m, only : t implicit none character(len=:), allocatable :: s type(t) :: foo character(len=256) :: imsg integer :: istat open(10, status="scratch") write(10,'(a)') 'hello' rewind(10) read(unit=10, fmt='(dt)', iostat=istat, iomsg=imsg) foo if (imsg.ne."End of record") STOP 1 rewind(10) read(unit=10, fmt=*, iostat=istat, iomsg=imsg) foo if (imsg.ne."End of record") STOP 2 s = "hello" read( unit=s, fmt='(dt)', iostat=istat, iomsg=imsg) foo if (imsg.ne."End of record") STOP 3 read( unit=s, fmt=*, iostat=istat, iomsg=imsg) foo if (imsg.ne."End of record") STOP 4 end program p