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 | 2ce2d86e049bedbed920d53b4eeb539c89cf73a9 (patch) | |
tree | fccab4a0917195bff518599e22ca97900e8b0f0e /lib/Sema/AnalysisBasedWarnings.cpp | |
parent | 83daac80e93247ab0041725f37c51c55cfc3174b (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204000 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r-- | lib/Sema/AnalysisBasedWarnings.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index d49dfd5845..32e40ab2ea 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/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) { |