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<PARENT>;
+#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.