! { dg-do compile }
! { dg-options -std=legacy }
!
! Test elimination of various segfaults and ICEs on error recovery.
!
! Contributed by Gerhard Steinmetz  <gerhard.steinmetz.fortran@t-online.de>
!
module m1
   type t
   end type
   interface write(formatted)
      module procedure s
   end interface
contains
   subroutine s(dtv,unit,iotype,vlist,extra,iostat,iomsg) ! { dg-error "Too many dummy arguments" }
      class(t), intent(in) :: dtv
      integer, intent(in) :: unit
      character(len=*), intent(in) :: iotype
      integer, intent(in) :: vlist(:)
      integer, intent(out) :: iostat
      character(len=*), intent(inout) :: iomsg
   end
end

module m2
   type t
   end type
   interface read(formatted)
      module procedure s
   end interface
contains
   subroutine s(dtv,unit,iotype,vlist,iostat,iomsg,extra) ! { dg-error "Too many dummy arguments" }
      class(t), intent(inout) :: dtv
      integer, intent(in) :: unit
      character(len=*), intent(in) :: iotype
      integer, intent(in) :: vlist(:)
      integer, intent(out) :: iostat
      character(len=*), intent(inout) :: iomsg
   end
end

module m3
   type t
   end type
   interface read(formatted)
      module procedure s
   end interface
contains
   subroutine s(dtv,extra,unit,iotype,vlist,iostat,iomsg) ! { dg-error "Too many dummy arguments" }
      class(t), intent(inout) :: dtv
      integer, intent(in) :: unit
      character(len=*), intent(in) :: iotype
      integer, intent(in) :: vlist(:)
      integer, intent(out) :: iostat
      character(len=*), intent(inout) :: iomsg
   end
end

module m4
   type t
   end type
   interface write(unformatted)
      module procedure s
   end interface
contains
   subroutine s(*) ! { dg-error "Alternate return" }
   end
end

module m5
   type t
   contains
      procedure :: s
      generic :: write(unformatted) => s
   end type
contains
   subroutine s(dtv, *) ! { dg-error "Too few dummy arguments" }
      class(t), intent(out) :: dtv
   end
end

module m6
   type t
      character(len=20) :: name
      integer(4) :: age
   contains
      procedure :: pruf
      generic :: read(unformatted) => pruf
   end type
contains
   subroutine pruf (dtv,unit,*,iomsg) ! { dg-error "Alternate return" }
      class(t), intent(inout) :: dtv
      integer, intent(in) :: unit
      character(len=*), intent(inout) :: iomsg
      write (unit=unit, iostat=iostat, iomsg=iomsg) dtv%name, dtv%age
   end
end

module m7
   type t
      character(len=20) :: name
      integer(4) :: age
   contains
      procedure :: pruf
      generic :: read(unformatted) => pruf
   end type
contains
   subroutine pruf (dtv,unit,iostat) ! { dg-error "Too few dummy arguments" }
      class(t), intent(inout) :: dtv
      integer, intent(in) :: unit
      integer, intent(out) :: iostat
      character(len=1) :: iomsg
      write (unit=unit, iostat=iostat, iomsg=iomsg) dtv%name, dtv%age
   end
end

module m
   type t
      character(len=20) :: name
      integer(4) :: age
   contains
      procedure :: pruf
      generic :: read(unformatted) => pruf
   end type
contains
   subroutine pruf (dtv,unit,iostat,iomsg)
      class(t), intent(inout) :: dtv
      integer, intent(in) :: unit
      integer, intent(out) :: iostat
      character(len=*), intent(inout) :: iomsg
      write (unit=unit, iostat=iostat, iomsg=iomsg) dtv%name, dtv%age
   end
end
program test
   use m
   character(3) :: a, b
   class(t) :: chairman ! { dg-error "must be dummy, allocatable or pointer" }
   open (unit=71, file='myunformatted_data.dat', form='unformatted')
   read (71) a, chairman, b 
   close (unit=71)
end

