From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id E2548382E47A; Tue, 6 Dec 2022 21:36:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E2548382E47A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1670362577; bh=K69aav5AwUwa+/hnUOVozqF3r2rc1nKbJi2anu1xaTY=; h=From:To:Subject:Date:From; b=LIPZbugcFsMWoxreFiWBNuHUKKgNqIVRdBhDtgMw3IgYIBSiM3tqwOrlp5W+b9lC8 xVkscw6nTFseXPCcEL15inc1jGF7tYsDySWiiz2feY0D4X8hzb9Ea/9srYgLRzDjIO fwJAqq5Uui7Lur5SvsC9gUMSUNZZnKgb2/Y0cVPY= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r13-4524] libstdc++: Add nodiscard attribute to mutex try_lock functions X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 48e21e878b2c6cfc7797088a7393a735de75883c X-Git-Newrev: af177d7280668e5b21560165dc828754618e6621 Message-Id: <20221206213617.E2548382E47A@sourceware.org> Date: Tue, 6 Dec 2022 21:36:17 +0000 (GMT) List-Id: https://gcc.gnu.org/g:af177d7280668e5b21560165dc828754618e6621 commit r13-4524-gaf177d7280668e5b21560165dc828754618e6621 Author: Jonathan Wakely Date: Mon Dec 5 12:39:23 2022 +0000 libstdc++: Add nodiscard attribute to mutex try_lock functions libstdc++-v3/ChangeLog: * include/bits/std_mutex.h (mutex): Add nodiscard attribute to try_lock member function. * include/bits/unique_lock.h (unique_lock): Likewise for try_lock, try_lock_until, try_lock_for member functions, and owns_lock and mutex member functions. * include/std/mutex (recursive_mutex): Likewise for try_lock member function. (timed_mutex, recursive_timed_mutex, try_lock): Likewise for try_lock, try_lock_until, try_lock_for member functions. (try_lock): Likewise for non-member function. * include/std/shared_mutex (shared_mutex): Likewise for try_lock and try_lock_shared member functions. (shared_timed_mutex): Likewise for try_lock, try_lock_for, try_lock_shared, try_lock_shared_for, try_lock_until, and try_lock_shared_until member functions. (shared_lock): Likewise for try_lock, try_lock, try_lock_for, try_lock_until, owns_lock, and mutex member functions. * testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc: Cast discarded value expression to void. * testsuite/30_threads/shared_lock/locking/3.cc: Likewise. * testsuite/30_threads/shared_lock/locking/4.cc: Likewise. * testsuite/30_threads/shared_lock/locking/clock_neg.cc: Likewise. * testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc: Likewise. * testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc: Likewise. * testsuite/30_threads/try_lock/4.cc: Likewise. * testsuite/30_threads/unique_lock/cons/60497.cc: Likewise. * testsuite/30_threads/unique_lock/locking/3.cc: Likewise. * testsuite/30_threads/unique_lock/locking/clock_neg.cc: Likewise. Diff: --- libstdc++-v3/include/bits/std_mutex.h | 1 + libstdc++-v3/include/bits/unique_lock.h | 5 +++++ libstdc++-v3/include/std/mutex | 14 ++++++++++++++ libstdc++-v3/include/std/shared_mutex | 22 +++++++++++++++++++--- .../try_lock_until/clock_neg.cc | 4 ++-- .../testsuite/30_threads/shared_lock/locking/3.cc | 2 +- .../testsuite/30_threads/shared_lock/locking/4.cc | 2 +- .../30_threads/shared_lock/locking/clock_neg.cc | 4 ++-- .../shared_timed_mutex/try_lock_until/clock_neg.cc | 4 ++-- .../timed_mutex/try_lock_until/clock_neg.cc | 4 ++-- libstdc++-v3/testsuite/30_threads/try_lock/4.cc | 2 +- .../testsuite/30_threads/unique_lock/cons/60497.cc | 2 +- .../testsuite/30_threads/unique_lock/locking/3.cc | 2 +- .../30_threads/unique_lock/locking/clock_neg.cc | 4 ++-- 14 files changed, 54 insertions(+), 18 deletions(-) diff --git a/libstdc++-v3/include/bits/std_mutex.h b/libstdc++-v3/include/bits/std_mutex.h index b22e0e12793..68f5fb9ed65 100644 --- a/libstdc++-v3/include/bits/std_mutex.h +++ b/libstdc++-v3/include/bits/std_mutex.h @@ -117,6 +117,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { diff --git a/libstdc++-v3/include/bits/unique_lock.h b/libstdc++-v3/include/bits/unique_lock.h index 9ed7ba25766..c6402d94e85 100644 --- a/libstdc++-v3/include/bits/unique_lock.h +++ b/libstdc++-v3/include/bits/unique_lock.h @@ -143,6 +143,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } + _GLIBCXX_NODISCARD bool try_lock() { @@ -158,6 +159,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -173,6 +175,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -215,6 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __ret; } + _GLIBCXX_NODISCARD bool owns_lock() const noexcept { return _M_owns; } @@ -222,6 +226,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION explicit operator bool() const noexcept { return owns_lock(); } + _GLIBCXX_NODISCARD mutex_type* mutex() const noexcept { return _M_device; } diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex index b310c15687d..aca5f91e03c 100644 --- a/libstdc++-v3/include/std/mutex +++ b/libstdc++-v3/include/std/mutex @@ -124,6 +124,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { @@ -253,6 +254,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { @@ -261,11 +263,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { return _M_try_lock_for(__rtime); } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { return _M_try_lock_until(__atime); } @@ -328,6 +332,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { @@ -336,11 +341,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { return _M_try_lock_for(__rtime); } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { return _M_try_lock_until(__atime); } @@ -395,6 +402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_locked = true; } + _GLIBCXX_NODISCARD bool try_lock() { @@ -406,6 +414,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -417,6 +426,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -478,6 +488,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ++_M_count; } + _GLIBCXX_NODISCARD bool try_lock() { @@ -494,6 +505,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -510,6 +522,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -616,6 +629,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * Sequentially calls try_lock() on each argument. */ template + _GLIBCXX_NODISCARD inline int try_lock(_L1& __l1, _L2& __l2, _L3&... __l3) { diff --git a/libstdc++-v3/include/std/shared_mutex b/libstdc++-v3/include/std/shared_mutex index cf74b32f185..7b70697f178 100644 --- a/libstdc++-v3/include/std/shared_mutex +++ b/libstdc++-v3/include/std/shared_mutex @@ -420,13 +420,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership void lock() { _M_impl.lock(); } - bool try_lock() { return _M_impl.try_lock(); } + [[nodiscard]] bool try_lock() { return _M_impl.try_lock(); } void unlock() { _M_impl.unlock(); } // Shared ownership void lock_shared() { _M_impl.lock_shared(); } - bool try_lock_shared() { return _M_impl.try_lock_shared(); } + [[nodiscard]] bool try_lock_shared() { return _M_impl.try_lock_shared(); } void unlock_shared() { _M_impl.unlock_shared(); } #if _GLIBCXX_USE_PTHREAD_RWLOCK_T @@ -473,10 +473,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership void lock() { _Base::lock(); } - bool try_lock() { return _Base::try_lock(); } + _GLIBCXX_NODISCARD bool try_lock() { return _Base::try_lock(); } void unlock() { _Base::unlock(); } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -489,10 +490,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Shared ownership void lock_shared() { _Base::lock_shared(); } + _GLIBCXX_NODISCARD bool try_lock_shared() { return _Base::try_lock_shared(); } void unlock_shared() { _Base::unlock_shared(); } template + _GLIBCXX_NODISCARD bool try_lock_shared_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -507,6 +510,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point& __atime) @@ -532,6 +536,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef _GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point& __atime) @@ -558,6 +563,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -580,6 +586,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Shared ownership template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point& __atime) @@ -619,6 +626,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef _GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point& __atime) @@ -645,6 +653,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point<_Clock, _Duration>& __atime) @@ -670,6 +679,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __abs_time) { @@ -694,6 +704,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Shared ownership template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point<_Clock, _Duration>& __abs_time) @@ -776,6 +787,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_owns = true; } + _GLIBCXX_NODISCARD bool try_lock() { @@ -784,6 +796,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rel_time) { @@ -792,6 +805,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __abs_time) { @@ -826,10 +840,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Getters + _GLIBCXX_NODISCARD bool owns_lock() const noexcept { return _M_owns; } explicit operator bool() const noexcept { return _M_owns; } + _GLIBCXX_NODISCARD mutex_type* mutex() const noexcept { return _M_pm; } private: diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc index 541bd19f3cf..91f2c83be0d 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc @@ -33,7 +33,7 @@ void test01() { std::recursive_timed_mutex m; - m.try_lock_until(clok::now()); // { dg-error "here" } + (void) m.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -51,7 +51,7 @@ void test02() { std::recursive_timed_mutex m; - m.try_lock_until(cloc::now()); // { dg-error "here" } + (void) m.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc index c7637d21993..8ad962baec3 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc @@ -38,7 +38,7 @@ int main() try { - l.try_lock_for(std::chrono::milliseconds(100)); + (void) l.try_lock_for(std::chrono::milliseconds(100)); } catch(const std::system_error&) { diff --git a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc index 126098dfeac..96388a1689d 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc @@ -40,7 +40,7 @@ int main() try { - l.try_lock_until(t); + (void) l.try_lock_until(t); } catch(const std::system_error&) { diff --git a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc index 3a6373b5926..d6df66efb17 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc @@ -34,7 +34,7 @@ test01() { std::shared_timed_mutex m; std::shared_lock l(m, std::defer_lock); - l.try_lock_until(clok::now()); // { dg-error "here" } + (void) l.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -53,7 +53,7 @@ test02() { std::shared_timed_mutex m; std::shared_lock l(m, std::defer_lock); - l.try_lock_until(cloc::now()); // { dg-error "here" } + (void) l.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc index ac401235f6c..f948101a884 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc @@ -33,7 +33,7 @@ void test01() { std::shared_timed_mutex m; - m.try_lock_until(clok::now()); // { dg-error "here" } + (void) m.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -51,7 +51,7 @@ void test02() { std::shared_timed_mutex m; - m.try_lock_shared_until(cloc::now()); // { dg-error "here" } + (void) m.try_lock_shared_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc index 36424747b4d..71c83c514bc 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc @@ -33,7 +33,7 @@ void test01() { std::timed_mutex m; - m.try_lock_until(clok::now()); // { dg-error "here" } + (void) m.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -51,7 +51,7 @@ void test02() { std::timed_mutex m; - m.try_lock_until(cloc::now()); // { dg-error "here" } + (void) m.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/try_lock/4.cc b/libstdc++-v3/testsuite/30_threads/try_lock/4.cc index cfb5a74734f..96afa55a68d 100644 --- a/libstdc++-v3/testsuite/30_threads/try_lock/4.cc +++ b/libstdc++-v3/testsuite/30_threads/try_lock/4.cc @@ -125,7 +125,7 @@ void test03() unreliable_lock::count = 0; try { - std::try_lock(l1, l2, l3); + (void) std::try_lock(l1, l2, l3); VERIFY( false ); } catch (int e) diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc index c3cb6214d63..a8a8db4318a 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc @@ -50,5 +50,5 @@ void test02() void test03() { test_type l1, l2, l3; - std::try_lock(l1, l2, l3); + (void) std::try_lock(l1, l2, l3); } diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc index 3cb787b3154..ecc5b82f1c1 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc @@ -38,7 +38,7 @@ int main() try { - l.try_lock_for(std::chrono::milliseconds(100)); + (void) l.try_lock_for(std::chrono::milliseconds(100)); } catch(const std::system_error&) { diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc index 68157f6ad26..b633e5fcc58 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc @@ -34,7 +34,7 @@ test01() { std::timed_mutex m; std::unique_lock l(m, std::defer_lock); - l.try_lock_until(clok::now()); // { dg-error "here" } + (void) l.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -53,7 +53,7 @@ test02() { std::recursive_timed_mutex m; std::unique_lock l(m, std::defer_lock); - l.try_lock_until(cloc::now()); // { dg-error "here" } + (void) l.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 }