From fd262197d74626579a784ee1cc0f3f3a0e3f33e9 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Mon, 29 May 2017 19:17:57 +0000 Subject: [PATCH] re PR fortran/53029 (missed optimization in internal read (without implied-do-loop)) 2017-05-29 Jerry DeLisle PR libgfortran/53029 * list_read.c (list_formatted_read_scala): Set the err return value to the common.flags error values. * gfortran.dg/read_5.f90: New test. From-SVN: r248577 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/read_5.f90 | 21 +++++++++++++++++++++ libgfortran/ChangeLog | 6 ++++++ libgfortran/io/list_read.c | 5 +++++ 4 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/read_5.f90 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4eb53a7ce1b..58dd05b3055 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-05-29 Jerry DeLisle + + PR libgfortran/53029 + * gfortran.dg/read_5.f90: New test. + 2017-05-29 Nathan Sidwell PR c++/80891 (#4) diff --git a/gcc/testsuite/gfortran.dg/read_5.f90 b/gcc/testsuite/gfortran.dg/read_5.f90 new file mode 100644 index 00000000000..81f1f11cf28 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/read_5.f90 @@ -0,0 +1,21 @@ +! { dg-do run } +! PR53029 Missed optimization, this test case took several seconds to + program internalread + implicit none + integer m + parameter(m=1000000) + character value*10 + character(80) :: result + integer i,j,intvalues(m) + real :: start, finish + intvalues = 33 + call cpu_time(start) + do j=1,100 + write(value,'(i3,a5)') j," 5 69" + read(value,*,end=20) intvalues + 20 write(result,*) (intvalues(i),i=2,4) + if (result.ne.(' 5 69 33')) call abort + call cpu_time(finish) + if ((finish-start).gt. 0.5) call abort + enddo + end program internalread diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index eaeac6ad0b7..e763232744d 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2017-05-29 Jerry DeLisle + + PR libgfortran/53029 + * list_read.c (list_formatted_read_scala): Set the err return + value to the common.flags error values. + 2017-05-28 Rainer Orth * acinclude.m4 (LIBGFOR_CHECK_FMA3): Use test from diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 6c00d11bf05..b6cd66706bb 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -2298,11 +2298,16 @@ list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p, free_saved (dtp); cleanup: + /* err may have been set above from finish_separator, so if it is set + trigger the hit_eof. The hit_eof will set bits in common.flags. */ if (err == LIBERROR_END) { free_line (dtp); hit_eof (dtp); } + /* Now we check common.flags for any errors that could have occurred in + a READ elsewhere such as in read_integer. */ + err = dtp->common.flags & IOPARM_LIBRETURN_MASK; fbuf_flush_list (dtp->u.p.current_unit, LIST_READING); return err; } -- 2.30.2