From 3aeb697a2158d359d9f951f6c6c6bcd9c53c8c2f Mon Sep 17 00:00:00 2001 From: Jerry DeLisle <jvdelisle@gcc.gnu.org> Date: Wed, 24 Jul 2024 10:29:08 -0700 Subject: [PATCH] Fortran: Suppress wrong End Of File error with user defined IO. PR libfortran/105361 libgfortran/ChangeLog: * io/list_read.c (finish_list_read): Add a condition check for a user defined derived type IO operation to avoid calling the EOF error. gcc/testsuite/ChangeLog: * gfortran.dg/pr105361.f90: New test. --- gcc/testsuite/gfortran.dg/pr105361.f90 | 41 ++++++++++++++++++++++++++ libgfortran/io/list_read.c | 3 +- 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr105361.f90 diff --git a/gcc/testsuite/gfortran.dg/pr105361.f90 b/gcc/testsuite/gfortran.dg/pr105361.f90 new file mode 100644 index 000000000000..e2d3b07cacaa --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr105361.f90 @@ -0,0 +1,41 @@ +! { dg-do run } + +module x + implicit none + type foo + real :: r + end type foo + interface read(formatted) + module procedure read_formatted + end interface read(formatted) +contains + subroutine read_formatted (dtv, unit, iotype, vlist, iostat, iomsg) + class (foo), 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 + read (unit,*,iostat=iostat,iomsg=iomsg) dtv%r + !print *,dtv%r + end subroutine read_formatted +end module x + +program main + use x + implicit none + type(foo) :: a, b + real :: c, d + open(10, access="stream") + write(10) "1 2" ! // NEW_LINE('A') + close(10) + open(10) + read(10,*) c, d + if ((c /= 1.0) .or. (d /= 2.0)) stop 1 + rewind(10) + !print *, c,d + read (10,*) a, b + close(10, status="delete") + if ((a%r /= 1.0) .or. (b%r /= 2.0)) stop 2 + !print *, a,b +end program main diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 5bbbef26c267..96b2efe854f5 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -2431,7 +2431,8 @@ finish_list_read (st_parameter_dt *dtp) /* Set the next_char and push_char worker functions. */ set_workers (dtp); - if (likely (dtp->u.p.child_saved_iostat == LIBERROR_OK)) + if (likely (dtp->u.p.child_saved_iostat == LIBERROR_OK) + && ((dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)) { c = next_char (dtp); if (c == EOF) -- GitLab