summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDeLesley Hutchins <delesley@google.com>2012-03-02 22:02:58 +0000
committerDeLesley Hutchins <delesley@google.com>2012-03-02 22:02:58 +0000
commita2587ef26d802ccc00b7853ffdab7b8070a67ad8 (patch)
tree746b1d40dee65884c13a9d79ce7b9bd9237e6936 /clang
parentccec40d9b75602c35025140fff5c4cdbd5f99f8d (diff)
downloadbcm5719-llvm-a2587ef26d802ccc00b7853ffdab7b8070a67ad8.tar.gz
bcm5719-llvm-a2587ef26d802ccc00b7853ffdab7b8070a67ad8.zip
Thread safety analysis: handle CFG blocks which call functions marked as noreturn.
llvm-svn: 151944
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Analysis/ThreadSafety.cpp4
-rw-r--r--clang/test/SemaCXX/warn-thread-safety-analysis.cpp17
2 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp
index 1370d5dbacd..40ad79b25c8 100644
--- a/clang/lib/Analysis/ThreadSafety.cpp
+++ b/clang/lib/Analysis/ThreadSafety.cpp
@@ -1526,6 +1526,10 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisDeclContext &AC) {
if (*PI == 0 || !VisitedBlocks.alreadySet(*PI))
continue;
+ // Ignore edges from blocks that can't return.
+ if ((*PI)->hasNoReturnElement())
+ continue;
+
// If the previous block ended in a 'continue' or 'break' statement, then
// a difference in locksets is probably due to a bug in that block, rather
// than in some other predecessor. In that case, keep the other
diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
index a7c1c002685..78a276c4da2 100644
--- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -2114,3 +2114,20 @@ class Foo {
} // end namespace InvalidNonStatic
+
+namespace NoReturnTest {
+
+bool condition();
+void fatal() __attribute__((noreturn));
+
+Mutex mu_;
+
+void test1() {
+ MutexLock lock(&mu_);
+ if (condition()) {
+ fatal();
+ return;
+ }
+}
+
+};
OpenPOWER on IntegriCloud