diff options
author | DeLesley Hutchins <delesley@google.com> | 2012-03-02 22:02:58 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2012-03-02 22:02:58 +0000 |
commit | a2587ef26d802ccc00b7853ffdab7b8070a67ad8 (patch) | |
tree | 746b1d40dee65884c13a9d79ce7b9bd9237e6936 | |
parent | ccec40d9b75602c35025140fff5c4cdbd5f99f8d (diff) | |
download | bcm5719-llvm-a2587ef26d802ccc00b7853ffdab7b8070a67ad8.tar.gz bcm5719-llvm-a2587ef26d802ccc00b7853ffdab7b8070a67ad8.zip |
Thread safety analysis: handle CFG blocks which call functions marked as noreturn.
llvm-svn: 151944
-rw-r--r-- | clang/lib/Analysis/ThreadSafety.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 17 |
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; + } +} + +}; |