diff --git a/src/sync.h b/src/sync.h --- a/src/sync.h +++ b/src/sync.h @@ -105,6 +105,13 @@ } using UniqueLock = std::unique_lock; +#ifdef __clang__ + //! For negative capabilities in the Clang Thread Safety Analysis. + //! A negative requirement uses the EXCLUSIVE_LOCKS_REQUIRED attribute, in + //! conjunction with the ! operator, to indicate that a mutex should not be + //! held. + const AnnotatedMixin &operator!() const { return *this; } +#endif // __clang__ }; /** diff --git a/src/threadsafety.h b/src/threadsafety.h --- a/src/threadsafety.h +++ b/src/threadsafety.h @@ -61,7 +61,16 @@ // StdMutex provides an annotated version of std::mutex for us, // and should only be used when sync.h Mutex/LOCK/etc are not usable. -class LOCKABLE StdMutex : public std::mutex {}; +class LOCKABLE StdMutex : public std::mutex { +public: +#ifdef __clang__ + //! For negative capabilities in the Clang Thread Safety Analysis. + //! A negative requirement uses the EXCLUSIVE_LOCKS_REQUIRED attribute, in + //! conjunction with the ! operator, to indicate that a mutex should not be + //! held. + const StdMutex &operator!() const { return *this; } +#endif // __clang__ +}; // StdLockGuard provides an annotated version of std::lock_guard for us, // and should only be used when sync.h Mutex/LOCK/etc are not usable.