diff options
-rw-r--r-- | clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h b/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h index d9efe1980cf..e3570130c2c 100644 --- a/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h +++ b/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h @@ -287,7 +287,7 @@ public: } const ValueDecl* valueDecl() const { - if (Negated) + if (Negated || CapExpr == nullptr) return nullptr; if (auto *P = dyn_cast<til::Project>(CapExpr)) return P->clangDecl(); diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index 01e16a488c9..b5d2f8e1de8 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -5182,3 +5182,10 @@ void test() { } // end namespace LockableUnions +// This used to crash. +class acquired_before_empty_str { + void WaitUntilSpaceAvailable() { + lock_.ReaderLock(); // expected-note {{acquired here}} + } // expected-warning {{mutex 'lock_' is still held at the end of function}} + Mutex lock_ ACQUIRED_BEFORE(""); +}; |