[committed] libstdc++: Fix exception thrown by std::shared_lock::unlock() [PR112089]
Checks
Commit Message
Tested x86_64-linux. Pushed to trunk. Worth backporting to all active
branches, I think.
-- >8 --
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.
---
libstdc++-v3/include/std/shared_mutex | 2 +-
.../30_threads/shared_lock/locking/112089.cc | 23 +++++++++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
create mode 100644 libstdc++-v3/testsuite/30_threads/shared_lock/locking/112089.cc
@@ -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;
}
new file mode 100644
@@ -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 );
+ }
+}