aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/libgfortran.h1
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/io/async.c7
-rw-r--r--libgfortran/runtime/error.c4
-rw-r--r--libgomp/ChangeLog5
-rw-r--r--libgomp/testsuite/libgomp.fortran/async_io_9.f9020
7 files changed, 50 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index fb0e47c..55d5dae 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-23 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/95191
+ * libgfortran.h (libgfortran_error_codes): Add
+ LIBERROR_BAD_WAIT_ID.
+
2020-05-20 Mark Eggleston <markeggleston@gcc.gnu.org>
PR fortran/39695
diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h
index d097caa..6a9139c 100644
--- a/gcc/fortran/libgfortran.h
+++ b/gcc/fortran/libgfortran.h
@@ -124,6 +124,7 @@ typedef enum
LIBERROR_SHORT_RECORD,
LIBERROR_CORRUPT_FILE,
LIBERROR_INQUIRE_INTERNAL_UNIT, /* Must be different from STAT_STOPPED_IMAGE. */
+ LIBERROR_BAD_WAIT_ID,
LIBERROR_LAST /* Not a real error, the last error # + 1. */
}
libgfortran_error_codes;
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 71c233c..ddb1af1 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2020-05-23 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/95191
+ * io/async.c (async_wait_id): Generate error if ID is higher
+ than the highest current ID.
+ * runtime/error.c (translate_error): Handle LIBERROR_BAD_WAIT_ID.
+
2020-05-21 H.J. Lu <hongjiu.lu@intel.com>
* m4/matmul.m4: Don't include <config/i386/cpuinfo.h>. Use
diff --git a/libgfortran/io/async.c b/libgfortran/io/async.c
index 63b9158..1bf38e9 100644
--- a/libgfortran/io/async.c
+++ b/libgfortran/io/async.c
@@ -424,6 +424,13 @@ async_wait_id (st_parameter_common *cmp, async_unit *au, int i)
}
LOCK (&au->lock);
+ if (i > au->id.high)
+ {
+ generate_error_common (cmp, LIBERROR_BAD_WAIT_ID, NULL);
+ UNLOCK (&au->lock);
+ return true;
+ }
+
NOTE ("Waiting for id %d", i);
if (au->id.waiting < i)
au->id.waiting = i;
diff --git a/libgfortran/runtime/error.c b/libgfortran/runtime/error.c
index 9ed5d56..ff6b852 100644
--- a/libgfortran/runtime/error.c
+++ b/libgfortran/runtime/error.c
@@ -660,6 +660,10 @@ translate_error (int code)
p = "Inquire statement identifies an internal file";
break;
+ case LIBERROR_BAD_WAIT_ID:
+ p = "Bad ID in WAIT statement";
+ break;
+
default:
p = "Unknown error code";
break;
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 5d40619..a0922a4 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-23 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/95191
+ * testsuite/libgomp.fortran/async_io_9.f90: New test.
+
2020-05-19 Jakub Jelinek <jakub@redhat.com>
* omp.h.in (omp_uintptr_t): New typedef.
diff --git a/libgomp/testsuite/libgomp.fortran/async_io_9.f90 b/libgomp/testsuite/libgomp.fortran/async_io_9.f90
new file mode 100644
index 0000000..2dc111c
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/async_io_9.f90
@@ -0,0 +1,20 @@
+! { dg-do run }
+! PR 95191 - this used to hang.
+! Original test case by Bill Long.
+program test
+ real a(10000)
+ integer my_id
+ integer bad_id
+ integer :: iostat
+ character (len=100) :: iomsg
+ data my_id /1/
+ data bad_id /2/
+ a = 1.
+ open (unit=10, file='test.dat', form='unformatted', &
+ & asynchronous='yes')
+ write (unit=10, asynchronous='yes', id=my_id) a
+ iomsg = ""
+ wait (unit=10, id=bad_id, iostat=iostat, iomsg=iomsg)
+ if (iostat == 0 .or. iomsg /= "Bad ID in WAIT statement") stop 1
+ close (unit=10, status='delete')
+end program test