summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/AnalysisBasedWarnings.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2014-03-15 05:47:06 +0000
committerTed Kremenek <kremenek@apple.com>2014-03-15 05:47:06 +0000
commitad8753c00eac02acf9ef30aceb316721abf7ef6c (patch)
tree7fa4d91b787da562f7e338ecd51c2ba63ebe1369 /clang/lib/Sema/AnalysisBasedWarnings.cpp
parentfb6b25b5e4cf09cf971f83d20a6b6eea9f04842c (diff)
downloadbcm5719-llvm-ad8753c00eac02acf9ef30aceb316721abf7ef6c.tar.gz
bcm5719-llvm-ad8753c00eac02acf9ef30aceb316721abf7ef6c.zip
Further refine -Wunreachable-code groups so that -Wno-unreachable-code-break doesn't turn off all unreachable code warnings.
Also relax unreachable 'break' and 'return' to not check for being preceded by a call to 'noreturn'. That turns out to not be so interesting in practice. llvm-svn: 204000
Diffstat (limited to 'clang/lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r--clang/lib/Sema/AnalysisBasedWarnings.cpp29
1 files changed, 19 insertions, 10 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index d49dfd58459..32e40ab2ea9 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -74,7 +74,7 @@ namespace {
diag = diag::warn_unreachable_break;
break;
case reachable_code::UK_TrivialReturn:
- diag = diag::warn_unreachable_trivial_return;
+ diag = diag::warn_unreachable_return;
break;
case reachable_code::UK_Other:
break;
@@ -1665,6 +1665,11 @@ clang::sema::AnalysisBasedWarnings::Policy::Policy() {
enableConsumedAnalysis = 0;
}
+static unsigned isEnabled(DiagnosticsEngine &D, unsigned diag) {
+ return (unsigned) D.getDiagnosticLevel(diag, SourceLocation()) !=
+ DiagnosticsEngine::Ignored;
+}
+
clang::sema::AnalysisBasedWarnings::AnalysisBasedWarnings(Sema &s)
: S(s),
NumFunctionsAnalyzed(0),
@@ -1676,16 +1681,20 @@ clang::sema::AnalysisBasedWarnings::AnalysisBasedWarnings(Sema &s)
MaxUninitAnalysisVariablesPerFunction(0),
NumUninitAnalysisBlockVisits(0),
MaxUninitAnalysisBlockVisitsPerFunction(0) {
+
+ using namespace diag;
DiagnosticsEngine &D = S.getDiagnostics();
- DefaultPolicy.enableCheckUnreachable = (unsigned)
- (D.getDiagnosticLevel(diag::warn_unreachable, SourceLocation()) !=
- DiagnosticsEngine::Ignored);
- DefaultPolicy.enableThreadSafetyAnalysis = (unsigned)
- (D.getDiagnosticLevel(diag::warn_double_lock, SourceLocation()) !=
- DiagnosticsEngine::Ignored);
- DefaultPolicy.enableConsumedAnalysis = (unsigned)
- (D.getDiagnosticLevel(diag::warn_use_in_invalid_state, SourceLocation()) !=
- DiagnosticsEngine::Ignored);
+
+ DefaultPolicy.enableCheckUnreachable =
+ isEnabled(D, warn_unreachable) ||
+ isEnabled(D, warn_unreachable_break) ||
+ isEnabled(D, warn_unreachable_return);
+
+ DefaultPolicy.enableThreadSafetyAnalysis =
+ isEnabled(D, warn_double_lock);
+
+ DefaultPolicy.enableConsumedAnalysis =
+ isEnabled(D, warn_use_in_invalid_state);
}
static void flushDiagnostics(Sema &S, sema::FunctionScopeInfo *fscope) {
OpenPOWER on IntegriCloud