aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2023-10-26 16:51:30 +0100
committerJonathan Wakely <jwakely@redhat.com>2023-10-26 21:10:47 +0100
commit0c305f3dec9a992dd775a3b9607b7b1e8c051859 (patch)
treec2f64672b8d761dd8fe3fcd9760c798222495736
parent7d06b29f8145805f33a33fb54a7d69acf31cecd6 (diff)
downloadgcc-0c305f3dec9a992dd775a3b9607b7b1e8c051859.zip
gcc-0c305f3dec9a992dd775a3b9607b7b1e8c051859.tar.gz
gcc-0c305f3dec9a992dd775a3b9607b7b1e8c051859.tar.bz2
libstdc++: Fix exception thrown by std::shared_lock::unlock() [PR112089]
The incorrect errc constant here looks like a copy&paste error. libstdc++-v3/ChangeLog: PR libstdc++/112089 * include/std/shared_mutex (shared_lock::unlock): Change errc constant to operation_not_permitted. * testsuite/30_threads/shared_lock/locking/112089.cc: New test.
-rw-r--r--libstdc++-v3/include/std/shared_mutex2
-rw-r--r--libstdc++-v3/testsuite/30_threads/shared_lock/locking/112089.cc23
2 files changed, 24 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/shared_mutex b/libstdc++-v3/include/std/shared_mutex
index 4f236a1..f205c36 100644
--- a/libstdc++-v3/include/std/shared_mutex
+++ b/libstdc++-v3/include/std/shared_mutex
@@ -820,7 +820,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
unlock()
{
if (!_M_owns)
- __throw_system_error(int(errc::resource_deadlock_would_occur));
+ __throw_system_error(int(errc::operation_not_permitted));
_M_pm->unlock_shared();
_M_owns = false;
}
diff --git a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/112089.cc b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/112089.cc
new file mode 100644
index 0000000..432c175
--- /dev/null
+++ b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/112089.cc
@@ -0,0 +1,23 @@
+// { dg-do run { target c++14 } }
+// { dg-require-gthreads "" }
+// { dg-additional-options "-pthread" { target pthread } }
+
+#include <shared_mutex>
+#include <system_error>
+#include <testsuite_hooks.h>
+
+// PR libstdc++/112089 shared_lock::unlock should throw operation_not_permitted
+
+int main()
+{
+ std::shared_lock<std::shared_timed_mutex> l;
+ try
+ {
+ l.unlock();
+ VERIFY( false );
+ }
+ catch (const std::system_error& e)
+ {
+ VERIFY( e.code() == std::errc::operation_not_permitted );
+ }
+}