forked from OSchip/llvm-project
[libc++] Use [[nodiscard]] for lock_guard, as an extension
Summary: D64914 added support for applying [[nodiscard]] to constructors. This commit uses that capability to flag incorrect uses of std::lock_guard where one forgets to actually create a variable for the lock_guard. rdar://45790820 Reviewers: mclow.lists, EricWF Subscribers: christof, jkorous, dexonsmith, libcxx-commits, Quuxplusone, lebedev.ri Tags: #libc Differential Revision: https://reviews.llvm.org/D65900 llvm-svn: 368664
This commit is contained in:
parent
e7b350a5d1
commit
86dd28a547
|
@ -345,3 +345,4 @@ which no dialect declares as such (See the second form described above).
|
|||
* ``search``
|
||||
* ``unique``
|
||||
* ``upper_bound``
|
||||
* ``lock_guard``'s constructors
|
||||
|
|
|
@ -94,10 +94,11 @@ private:
|
|||
mutex_type& __m_;
|
||||
public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY
|
||||
explicit lock_guard(mutex_type& __m) _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability(__m))
|
||||
: __m_(__m) {__m_.lock();}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY
|
||||
lock_guard(mutex_type& __m, adopt_lock_t) _LIBCPP_THREAD_SAFETY_ANNOTATION(requires_capability(__m))
|
||||
: __m_(__m) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
// guides from existing ctors, needed by default_searcher() below.
|
||||
// UNSUPPORTED: apple-clang-9
|
||||
|
||||
// Test that entities declared [[nodiscard]] as at extension by libc++, are
|
||||
// Test that entities declared [[nodiscard]] as an extension by libc++, are
|
||||
// only actually declared such when _LIBCPP_ENABLE_NODISCARD is specified.
|
||||
|
||||
// All entities to which libc++ applies [[nodiscard]] as an extension should
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: libcpp-has-no-threads
|
||||
|
||||
// [[nodiscard]] on constructors isn't supported by all compilers
|
||||
// UNSUPPORTED: clang-6, clang-6, clang-8, clang-9
|
||||
// UNSUPPORTED: apple-clang-9, apple-clang-10, apple-clang-11
|
||||
|
||||
// <mutex>
|
||||
|
||||
// template <class Mutex> class lock_guard;
|
||||
|
||||
// [[nodiscard]] explicit lock_guard(mutex_type& m);
|
||||
// [[nodiscard]] lock_guard(mutex_type& m, adopt_lock_t);
|
||||
|
||||
// Test that we properly apply [[nodiscard]] to lock_guard's constructors,
|
||||
// which is a libc++ extension.
|
||||
|
||||
// MODULES_DEFINES: _LIBCPP_ENABLE_NODISCARD
|
||||
#define _LIBCPP_ENABLE_NODISCARD
|
||||
#include <mutex>
|
||||
|
||||
int main(int, char**) {
|
||||
std::mutex m;
|
||||
std::lock_guard<std::mutex>{m}; // expected-error{{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
|
||||
std::lock_guard<std::mutex>{m, std::adopt_lock}; // expected-error{{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue