diff options
author | Ted Kremenek <kremenek@apple.com> | 2014-03-15 05:47:06 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2014-03-15 05:47:06 +0000 |
commit | ad8753c00eac02acf9ef30aceb316721abf7ef6c (patch) | |
tree | 7fa4d91b787da562f7e338ecd51c2ba63ebe1369 /clang/lib/Sema/AnalysisBasedWarnings.cpp | |
parent | fb6b25b5e4cf09cf971f83d20a6b6eea9f04842c (diff) | |
download | bcm5719-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.cpp | 29 |
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) { |