! { 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") call abort
  rewind(10)
  read(unit=10, fmt=*, iostat=istat, iomsg=imsg) foo
  if (imsg.ne."End of record") call abort
  s = "hello"
  read( unit=s, fmt='(dt)', iostat=istat, iomsg=imsg) foo
  if (imsg.ne."End of record") call abort
  read( unit=s, fmt=*, iostat=istat, iomsg=imsg) foo
  if (imsg.ne."End of record") call abort
end program p

! { dg-final { cleanup-modules "t_m" } }
