[PATCH] Reorder std::scoped_lock parameters as per P0739R0 DR status

Jonathan Wakely jwakely@redhat.com
Sat Jul 15 15:48:00 GMT 2017


WG21 just approved this change as a DR for C++17, so that class
template argument deduction works when using std::adopt_lock with a
std::scoped_lock.

	* 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.

Tested powerpc64le-linux, committed to trunk.

I think we should also make this change and the r250213 one to
std::variant (which is in the same paper) on gcc-7-branch.

-------------- next part --------------
commit bd39b9c170c46347e521130ec368964b5977e866
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Sat Jul 15 16:14:48 2017 +0100

    Reorder std::scoped_lock parameters as per P0739R0 DR status
    
    	* 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.

diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex
index df48b46..fadb9f6 100644
--- a/libstdc++-v3/include/std/mutex
+++ b/libstdc++-v3/include/std/mutex
@@ -557,7 +557,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
 #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
@@ -570,7 +570,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       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
 
@@ -609,7 +609,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       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
 
diff --git a/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/1.cc b/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/1.cc
index 9f1b48c..e420ab0 100644
--- a/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/1.cc
+++ b/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/1.cc
@@ -79,7 +79,7 @@ void test01()
 
   try
     {
-      std::scoped_lock<BasicLockable> l(m, std::adopt_lock);
+      std::scoped_lock<BasicLockable> l(std::adopt_lock, m);
     }
   catch (...)
     {
@@ -113,7 +113,7 @@ void test02()
 
   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 );
     }
diff --git a/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/deduction.cc b/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/deduction.cc
index 399de7a..7d4f5bf 100644
--- a/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/deduction.cc
+++ b/libstdc++-v3/testsuite/30_threads/scoped_lock/cons/deduction.cc
@@ -51,3 +51,28 @@ test01()
   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);
+}
diff --git a/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc b/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc
index 55756d8..0a8903e 100644
--- a/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc
+++ b/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc
@@ -25,6 +25,12 @@
 
 #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


More information about the Gcc-patches mailing list