summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2012-06-02 01:01:07 +0000
committerAlexander Kornienko <alexfh@google.com>2012-06-02 01:01:07 +0000
commit06caf7d59fb38c700a97f72af203260876d05305 (patch)
treeb96ea47b9eae28328e642caaf95ae72ebadaf01d /clang/lib
parent7ba26150478748c050aa61753e6ced319fa72987 (diff)
downloadbcm5719-llvm-06caf7d59fb38c700a97f72af203260876d05305.tar.gz
bcm5719-llvm-06caf7d59fb38c700a97f72af203260876d05305.zip
Implementation of a "soft opt-in" option for -Wimplicit-fallthrough diagnostics: -Wimplicit-fallthrough-per-method
llvm-svn: 157871
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/AnalysisBasedWarnings.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 8f16e70b154..cea8a765c80 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -814,13 +814,17 @@ namespace {
};
}
-static void DiagnoseSwitchLabelsFallthrough(Sema &S, AnalysisDeclContext &AC) {
+static void DiagnoseSwitchLabelsFallthrough(Sema &S, AnalysisDeclContext &AC,
+ bool PerMethod) {
FallthroughMapper FM(S);
FM.TraverseStmt(AC.getBody());
if (!FM.foundSwitchStatements())
return;
+ if (PerMethod && FM.getFallthroughStmts().empty())
+ return;
+
CFG *Cfg = AC.getCFG();
if (!Cfg)
@@ -838,7 +842,9 @@ static void DiagnoseSwitchLabelsFallthrough(Sema &S, AnalysisDeclContext &AC) {
if (!FM.checkFallThroughIntoBlock(B, AnnotatedCnt))
continue;
- S.Diag(Label->getLocStart(), diag::warn_unannotated_fallthrough);
+ S.Diag(Label->getLocStart(),
+ PerMethod ? diag::warn_unannotated_fallthrough_per_method
+ : diag::warn_unannotated_fallthrough);
if (!AnnotatedCnt) {
SourceLocation L = Label->getLocStart();
@@ -1324,9 +1330,14 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
}
}
- if (Diags.getDiagnosticLevel(diag::warn_unannotated_fallthrough,
- D->getLocStart()) != DiagnosticsEngine::Ignored) {
- DiagnoseSwitchLabelsFallthrough(S, AC);
+ bool FallThroughDiagFull =
+ Diags.getDiagnosticLevel(diag::warn_unannotated_fallthrough,
+ D->getLocStart()) != DiagnosticsEngine::Ignored;
+ bool FallThroughDiagPerMethod =
+ Diags.getDiagnosticLevel(diag::warn_unannotated_fallthrough_per_method,
+ D->getLocStart()) != DiagnosticsEngine::Ignored;
+ if (FallThroughDiagFull || FallThroughDiagPerMethod) {
+ DiagnoseSwitchLabelsFallthrough(S, AC, !FallThroughDiagFull);
}
// Collect statistics about the CFG if it was built.
OpenPOWER on IntegriCloud