diff options
-rw-r--r-- | clang/lib/Analysis/AnalysisDeclContext.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Sema/AnalysisBasedWarnings.cpp | 15 | ||||
-rw-r--r-- | clang/test/Sema/warn-overlap.c | 6 |
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; +} |