From dc0541f12f6dfa2c4a91d2f12bd86ed6f0f65bd5 Mon Sep 17 00:00:00 2001 From: DeLesley Hutchins Date: Tue, 29 Sep 2015 15:25:51 +0000 Subject: [PATCH] Thread Safety Analysis: fix before/after checks so that they work on global variables as well member variables. llvm-svn: 248803 --- .../clang/Analysis/Analyses/ThreadSafetyCommon.h | 2 ++ clang/lib/Analysis/ThreadSafetyCommon.cpp | 2 +- clang/test/Sema/warn-thread-safety-analysis.c | 3 ++- clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 13 +++++++++++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h b/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h index 9b7725ab0f3c..d9efe1980cfe 100644 --- a/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h +++ b/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h @@ -291,6 +291,8 @@ public: return nullptr; if (auto *P = dyn_cast(CapExpr)) return P->clangDecl(); + if (auto *P = dyn_cast(CapExpr)) + return P->clangDecl(); return nullptr; } diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp index 3c4d6b30159f..fa82378da18a 100644 --- a/clang/lib/Analysis/ThreadSafetyCommon.cpp +++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp @@ -290,7 +290,7 @@ til::SExpr *SExprBuilder::translateDeclRefExpr(const DeclRefExpr *DRE, VD = FD->getParamDecl(I); } - // For non-local variables, treat it as a referenced to a named object. + // For non-local variables, treat it as a reference to a named object. return new (Arena) til::LiteralPtr(VD); } diff --git a/clang/test/Sema/warn-thread-safety-analysis.c b/clang/test/Sema/warn-thread-safety-analysis.c index 55e6e707f013..a0c4026b9136 100644 --- a/clang/test/Sema/warn-thread-safety-analysis.c +++ b/clang/test/Sema/warn-thread-safety-analysis.c @@ -81,7 +81,8 @@ int main() { mutex_shared_lock(&mu2); Foo_fun1(1); - mutex_shared_lock(&mu1); // expected-warning{{acquiring mutex 'mu1' that is already held}} + mutex_shared_lock(&mu1); // expected-warning{{acquiring mutex 'mu1' that is already held}} \ + expected-warning{{mutex 'mu1' must be acquired before 'mu2'}} mutex_unlock(&mu1); mutex_unlock(&mu2); mutex_shared_lock(&mu1); diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index cdbef700a181..6daefd78d3df 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -5145,4 +5145,17 @@ void test() { } // end namespace TestReferenceNoThreadSafetyAnalysis +namespace GlobalAcquiredBeforeAfterTest { + +Mutex mu1; +Mutex mu2 ACQUIRED_AFTER(mu1); + +void test3() { + mu2.Lock(); + mu1.Lock(); // expected-warning {{mutex 'mu1' must be acquired before 'mu2'}} + mu1.Unlock(); + mu2.Unlock(); +} + +} // end namespace GlobalAcquiredBeforeAfterTest