summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2014-04-15 00:57:50 +0000
committerRichard Trieu <rtrieu@google.com>2014-04-15 00:57:50 +0000
commite9fa266cbad6ac10eb8f7778dd6ddb55ee07491d (patch)
tree53b371264d9ce63a339d1f5db61080924f1e77e3
parent81ab90f7ed3c7420fca87c7339c823f136dcc4e5 (diff)
downloadbcm5719-llvm-e9fa266cbad6ac10eb8f7778dd6ddb55ee07491d.tar.gz
bcm5719-llvm-e9fa266cbad6ac10eb8f7778dd6ddb55ee07491d.zip
Fix a bad interaction between -Wtautological-overlap-compare and delayed
diagnostics which caused delayed diagnostics on dead paths to be emitted. llvm-svn: 206232
-rw-r--r--clang/lib/Analysis/AnalysisDeclContext.cpp6
-rw-r--r--clang/lib/Sema/AnalysisBasedWarnings.cpp15
-rw-r--r--clang/test/Sema/warn-overlap.c6
3 files changed, 23 insertions, 4 deletions
diff --git a/clang/lib/Analysis/AnalysisDeclContext.cpp b/clang/lib/Analysis/AnalysisDeclContext.cpp
index c90d9479512..ef9ce56c9bd 100644
--- a/clang/lib/Analysis/AnalysisDeclContext.cpp
+++ b/clang/lib/Analysis/AnalysisDeclContext.cpp
@@ -189,6 +189,9 @@ CFG *AnalysisDeclContext::getCFG() {
if (PM)
addParentsForSyntheticStmts(cfg.get(), *PM);
+
+ // The Obersver should only observe one build of the CFG.
+ getCFGBuildOptions().Observer = 0;
}
return cfg.get();
}
@@ -205,6 +208,9 @@ CFG *AnalysisDeclContext::getUnoptimizedCFG() {
if (PM)
addParentsForSyntheticStmts(completeCFG.get(), *PM);
+
+ // The Obersver should only observe one build of the CFG.
+ getCFGBuildOptions().Observer = 0;
}
return completeCFG.get();
}
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 32bdef6da92..fc591bd77c5 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -1838,12 +1838,12 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
.setAlwaysAdd(Stmt::AttributedStmtClass);
}
+ // Install the logical handler for -Wtautological-overlap-compare
+ std::unique_ptr<LogicalErrorHandler> LEH;
if (Diags.getDiagnosticLevel(diag::warn_tautological_overlap_comparison,
D->getLocStart())) {
- LogicalErrorHandler LEH(S);
- AC.getCFGBuildOptions().Observer = &LEH;
- AC.getCFG();
- AC.getCFGBuildOptions().Observer = 0;
+ LEH.reset(new LogicalErrorHandler(S));
+ AC.getCFGBuildOptions().Observer = LEH.get();
}
// Emit delayed diagnostics.
@@ -1991,6 +1991,13 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
}
}
+ // If none of the previous checks caused a CFG build, trigger one here
+ // for -Wtautological-overlap-compare
+ if (Diags.getDiagnosticLevel(diag::warn_tautological_overlap_comparison,
+ D->getLocStart())) {
+ AC.getCFG();
+ }
+
// Collect statistics about the CFG if it was built.
if (S.CollectStats && AC.isCFGBuilt()) {
++NumFunctionsAnalyzed;
diff --git a/clang/test/Sema/warn-overlap.c b/clang/test/Sema/warn-overlap.c
index c98547153c6..44d6ad5efa5 100644
--- a/clang/test/Sema/warn-overlap.c
+++ b/clang/test/Sema/warn-overlap.c
@@ -56,3 +56,9 @@ void f(int x) {
if (x == (mydefine + 1) && x > 3) { }
}
+// Don't generate a warning here.
+void array_out_of_bounds() {
+ int x;
+ int buffer[4];
+ x = (-7 > 0) ? (buffer[-7]) : 0;
+}
OpenPOWER on IntegriCloud