diff options
author | DeLesley Hutchins <delesley@google.com> | 2012-09-20 23:14:43 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2012-09-20 23:14:43 +0000 |
commit | fcb0ffa622b09a9c8acc325e7b6cd690f3ada487 (patch) | |
tree | 3ed3e9c5bb483dfa768c93b3eaee3c67140939a9 | |
parent | dcadc5cfb77b4f69835c013d2a1c854ce1a82efc (diff) | |
download | bcm5719-llvm-fcb0ffa622b09a9c8acc325e7b6cd690f3ada487.tar.gz bcm5719-llvm-fcb0ffa622b09a9c8acc325e7b6cd690f3ada487.zip |
Thread-safety analysis: fix bug where shared trylock was treated
as exclusive.
llvm-svn: 164332
-rw-r--r-- | clang/lib/Analysis/ThreadSafety.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 30 |
2 files changed, 31 insertions, 1 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index fd595566651..d9ab61e7534 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -1681,7 +1681,7 @@ void ThreadSafetyAnalyzer::getEdgeLockset(FactSet& Result, case attr::SharedTrylockFunction: { SharedTrylockFunctionAttr *A = cast<SharedTrylockFunctionAttr>(Attr); - getMutexIDs(ExclusiveLocksToAdd, A, Exp, FunDecl, + getMutexIDs(SharedLocksToAdd, A, Exp, FunDecl, PredBlock, CurrBlock, A->getSuccessValue(), Negate); break; } diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index c45adb6f0cc..fa8786a957f 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -1655,6 +1655,8 @@ void bar() { }; // end namespace FunctionAttrTest +namespace TryLockTest { + struct TestTryLock { Mutex mu; int a GUARDED_BY(mu); @@ -1751,8 +1753,36 @@ struct TestTryLock { b = !b; } } + + // Test merge of exclusive trylock + void foo11() { + if (cond) { + if (!mu.TryLock()) + return; + } + else { + mu.Lock(); + } + a = 10; + mu.Unlock(); + } + + // Test merge of shared trylock + void foo12() { + if (cond) { + if (!mu.ReaderTryLock()) + return; + } + else { + mu.ReaderLock(); + } + int i = a; + mu.Unlock(); + } }; // end TestTrylock +} // end namespace TrylockTest + namespace TestTemplateAttributeInstantiation { |