2007-12-27 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Dec 2007 12:33:52 +0000 (12:33 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Dec 2007 12:33:52 +0000 (12:33 +0000)
PR libfortran/34594
* runtime/error.c: If there was a previous error, don't
mask it with another error mesage, EOF or EOR condition.

2007-12-27  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/34594
* gfortran.dg/direct_io_8.f90:  New test case.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131199 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/direct_io_8.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/runtime/error.c

index 6f3fc35..dd87ad9 100644 (file)
@@ -1,3 +1,8 @@
+2007-12-27  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/34594
+       * gfortran.dg/direct_io_8.f90:  New test case.
+
 2007-12-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/34281
diff --git a/gcc/testsuite/gfortran.dg/direct_io_8.f90 b/gcc/testsuite/gfortran.dg/direct_io_8.f90
new file mode 100644 (file)
index 0000000..5e384a1
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do run }
+! PR 34594 - this used to give runtime errors due to an
+! end condition.
+program main
+  implicit none
+  integer :: iou, i, ir, TEMP_CHANGES
+  i=44
+  ir = -42
+
+  open(11,file="foo.dat")
+  ! Try a direct access read on a formatted sequential rile
+  READ (11, REC = I, ERR = 99) TEMP_CHANGES
+  call abort
+99 continue
+  ! Variant 2: ir is ok, but does not jump to 99
+  READ (11, REC = I, IOSTAT = IR, ERR = 98) TEMP_CHANGES
+  call abort
+
+98 continue
+  if(ir == 0) then
+     call abort
+  end if
+  close(11,status="delete")
+end program main
+
index 495d536..f7d260d 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-27  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/34594
+       * runtime/error.c: If there was a previous error, don't
+       mask it with another error mesage, EOF or EOR condition.
+
 2007-12-25  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/34560
index 279e265..f0a4ff2 100644 (file)
@@ -410,6 +410,13 @@ translate_error (int code)
 void
 generate_error (st_parameter_common *cmp, int family, const char *message)
 {
+
+  /* If there was a previous error, don't mask it with another
+     error message, EOF or EOR condition.  */
+
+  if ((cmp->flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_ERROR)
+    return;
+
   /* Set the error status.  */
   if ((cmp->flags & IOPARM_HAS_IOSTAT))
     *cmp->iostat = (family == LIBERROR_OS) ? errno : family;