+2017-07-15 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/std/mutex (scoped_lock): Reorder std::adopt_lock_t parameter
+ as per P0739R0.
+ * testsuite/30_threads/scoped_lock/cons/1.cc: Reorder arguments.
+ * testsuite/30_threads/scoped_lock/cons/deduction.cc: Test deduction
+ with std::adopt_lock_t.
+ * testsuite/30_threads/scoped_lock/requirements/typedefs.cc: Check
+ feature-test macro.
+
2017-07-14 Jason Merrill <jason@redhat.com>
Jonathan Wakely <jwakely@redhat.com>
}
#if __cplusplus > 201402L
-#define __cpp_lib_scoped_lock 201703
+#define __cpp_lib_scoped_lock 201707
/** @brief A scoped lock type for multiple lockable objects.
*
* A scoped_lock controls mutex ownership within a scope, releasing
explicit scoped_lock(_MutexTypes&... __m) : _M_devices(std::tie(__m...))
{ std::lock(__m...); }
- explicit scoped_lock(_MutexTypes&... __m, adopt_lock_t) noexcept
+ explicit scoped_lock(adopt_lock_t, _MutexTypes&... __m) noexcept
: _M_devices(std::tie(__m...))
{ } // calling thread owns mutex
explicit scoped_lock(mutex_type& __m) : _M_device(__m)
{ _M_device.lock(); }
- explicit scoped_lock(mutex_type& __m, adopt_lock_t) noexcept
+ explicit scoped_lock(adopt_lock_t, mutex_type& __m) noexcept
: _M_device(__m)
{ } // calling thread owns mutex
try
{
- std::scoped_lock<BasicLockable> l(m, std::adopt_lock);
+ std::scoped_lock<BasicLockable> l(std::adopt_lock, m);
}
catch (...)
{
try
{
- std::scoped_lock<Lockable<1>, Lockable<2>> l(m1, m2, std::adopt_lock);
+ std::scoped_lock<Lockable<1>, Lockable<2>> l(std::adopt_lock, m1, m2);
VERIFY( m1.m.locked );
VERIFY( m2.m.locked );
}
std::scoped_lock l2(m2, m3);
check_type<std::scoped_lock<Lockable, std::mutex>>(l2);
}
+
+void
+test02()
+{
+ std::scoped_lock l0(std::adopt_lock);
+ check_type<std::scoped_lock<>>(l0);
+
+ struct BasicLockable {
+ void lock() { }
+ void unlock() { }
+ } m1;
+
+ std::scoped_lock l1(std::adopt_lock, m1);
+ check_type<std::scoped_lock<BasicLockable>>(l1);
+
+ struct Lockable {
+ void lock() { }
+ void unlock() { }
+ bool try_lock() { return true; }
+ } m2;
+
+ std::mutex m3;
+ std::scoped_lock l2(std::adopt_lock, m2, m3);
+ check_type<std::scoped_lock<Lockable, std::mutex>>(l2);
+}
#include <mutex>
+#ifndef __cpp_lib_scoped_lock
+# error "Feature-test macro for scoped_lock missing"
+#elif __cpp_lib_scoped_lock != 201707
+# error "Feature-test macro for scoped_lock has wrong value"
+#endif
+
void test01()
{
// Check for required typedefs