summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDeLesley Hutchins <delesley@google.com>2012-07-02 21:59:24 +0000
committerDeLesley Hutchins <delesley@google.com>2012-07-02 21:59:24 +0000
commitc4a6e515969a3f62100673cf4d400eaee0d9df82 (patch)
tree7cd514ac0a5f0c62dbd069308a3986432309ac85 /clang
parentf0190752711546267a9e4ffd47b285c0ba0d1bc5 (diff)
downloadbcm5719-llvm-c4a6e515969a3f62100673cf4d400eaee0d9df82.tar.gz
bcm5719-llvm-c4a6e515969a3f62100673cf4d400eaee0d9df82.zip
Thread Safety Analysis: turn off checking within trylock functions.
llvm-svn: 159601
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Analysis/ThreadSafety.cpp6
-rw-r--r--clang/test/SemaCXX/warn-thread-safety-analysis.cpp27
2 files changed, 33 insertions, 0 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp
index fd4551b975d..7406f324ae5 100644
--- a/clang/lib/Analysis/ThreadSafety.cpp
+++ b/clang/lib/Analysis/ThreadSafety.cpp
@@ -1654,6 +1654,12 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisDeclContext &AC) {
} else if (isa<SharedLockFunctionAttr>(Attr)) {
// Don't try to check lock functions for now
return;
+ } else if (isa<ExclusiveTrylockFunctionAttr>(Attr)) {
+ // Don't try to check trylock functions for now
+ return;
+ } else if (isa<SharedTrylockFunctionAttr>(Attr)) {
+ // Don't try to check trylock functions for now
+ return;
}
}
}
diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
index 1c47035c2b2..cda25142387 100644
--- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -2403,6 +2403,33 @@ void Foo::test3() {
} // end namespace ReleasableScopedLock
+namespace TrylockFunctionTest {
+
+class Foo {
+public:
+ Mutex mu1_;
+ Mutex mu2_;
+ bool c;
+
+ bool lockBoth() EXCLUSIVE_TRYLOCK_FUNCTION(true, mu1_, mu2_);
+};
+
+bool Foo::lockBoth() {
+ if (!mu1_.TryLock())
+ return false;
+
+ mu2_.Lock();
+ if (!c) {
+ mu1_.Unlock();
+ mu2_.Unlock();
+ return false;
+ }
+
+ return true;
+}
+
+
+} // end namespace TrylockFunctionTest
OpenPOWER on IntegriCloud