https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78881

            Bug ID: 78881
           Summary: [F03] reading from string with DTIO procedure does not
                    work properly
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: janus at gcc dot gnu.org
  Target Milestone: ---

From
https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/706063:


module t_m

   use, intrinsic :: iso_fortran_env, only : iostat_end, iostat_eor,
output_unit

   implicit none

   private

   type, public :: t
      private
      character(len=:), allocatable :: m_s
   contains
      !private
      procedure, pass(this), private :: read_t
      generic :: read(formatted) => read_t
   end type t

contains

    subroutine read_t(this, lun, iotype, vlist, istat, imsg)

      ! argument definitions
      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

      !.. Local variables
      character(len=*), parameter :: sfmt = "(*(g0))"
      character(len=1) :: c
      integer :: i

      i = 0
      loop_read: do

         i = i + 1

         read( unit=lun, fmt="(a)", iostat=istat, iomsg=imsg ) c
         select case ( istat )
            case ( 0 )
               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

      end do loop_read

      return

   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

   s = "Hello"
   read( unit=s, fmt=*, iostat=istat, iomsg=imsg ) foo
   if ( istat /= 0 ) then
      print *, "istat = ", istat
      print *, imsg
   end if

   stop

end program p


After compiling this with current trunk, the runtime output is:

i = 1, c = e
i = 2, c = l
i = 3, c = l
i = 4, c = o
i = 5, istat = iostat_end
 istat =           -1
 End of file


It seems like the first character is being swallowed somewhere ...

Reply via email to