<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 14 April 2014 17:57, Richard Trieu <span dir="ltr"><<a href="mailto:rtrieu@google.com" target="_blank">rtrieu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Author: rtrieu<br>
Date: Mon Apr 14 19:57:50 2014<br>
New Revision: 206232<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=206232&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=206232&view=rev</a><br>
Log:<br>
Fix a bad interaction between -Wtautological-overlap-compare and delayed<br>
diagnostics which caused delayed diagnostics on dead paths to be emitted.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp<br>
    cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp<br>
    cfe/trunk/test/Sema/warn-overlap.c<br>
<br>
Modified: cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp?rev=206232&r1=206231&r2=206232&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp?rev=206232&r1=206231&r2=206232&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp Mon Apr 14 19:57:50 2014<br>
@@ -189,6 +189,9 @@ CFG *AnalysisDeclContext::getCFG() {<br>
<br>
     if (PM)<br>
       addParentsForSyntheticStmts(cfg.get(), *PM);<br>
+<br>
+    // The Obersver should only observe one build of the CFG.<br></blockquote><div><br></div><div>Typo, "Obersver".</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


+    getCFGBuildOptions().Observer = 0;<br>
   }<br>
   return cfg.get();<br>
 }<br>
@@ -205,6 +208,9 @@ CFG *AnalysisDeclContext::getUnoptimized<br>
<br>
     if (PM)<br>
       addParentsForSyntheticStmts(completeCFG.get(), *PM);<br>
+<br>
+    // The Obersver should only observe one build of the CFG.<br></blockquote><div><br></div><div>Typo again!</div><div><br></div><div>Nick</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


+    getCFGBuildOptions().Observer = 0;<br>
   }<br>
   return completeCFG.get();<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=206232&r1=206231&r2=206232&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=206232&r1=206231&r2=206232&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original)<br>
+++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Mon Apr 14 19:57:50 2014<br>
@@ -1838,12 +1838,12 @@ AnalysisBasedWarnings::IssueWarnings(sem<br>
       .setAlwaysAdd(Stmt::AttributedStmtClass);<br>
   }<br>
<br>
+  // Install the logical handler for -Wtautological-overlap-compare<br>
+  std::unique_ptr<LogicalErrorHandler> LEH;<br>
   if (Diags.getDiagnosticLevel(diag::warn_tautological_overlap_comparison,<br>
                                D->getLocStart())) {<br>
-    LogicalErrorHandler LEH(S);<br>
-    AC.getCFGBuildOptions().Observer = &LEH;<br>
-    AC.getCFG();<br>
-    AC.getCFGBuildOptions().Observer = 0;<br>
+    LEH.reset(new LogicalErrorHandler(S));<br>
+    AC.getCFGBuildOptions().Observer = LEH.get();<br>
   }<br>
<br>
   // Emit delayed diagnostics.<br>
@@ -1991,6 +1991,13 @@ AnalysisBasedWarnings::IssueWarnings(sem<br>
     }<br>
   }<br>
<br>
+  // If none of the previous checks caused a CFG build, trigger one here<br>
+  // for -Wtautological-overlap-compare<br>
+  if (Diags.getDiagnosticLevel(diag::warn_tautological_overlap_comparison,<br>
+                               D->getLocStart())) {<br>
+    AC.getCFG();<br>
+  }<br>
+<br>
   // Collect statistics about the CFG if it was built.<br>
   if (S.CollectStats && AC.isCFGBuilt()) {<br>
     ++NumFunctionsAnalyzed;<br>
<br>
Modified: cfe/trunk/test/Sema/warn-overlap.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-overlap.c?rev=206232&r1=206231&r2=206232&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-overlap.c?rev=206232&r1=206231&r2=206232&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/test/Sema/warn-overlap.c (original)<br>
+++ cfe/trunk/test/Sema/warn-overlap.c Mon Apr 14 19:57:50 2014<br>
@@ -56,3 +56,9 @@ void f(int x) {<br>
   if (x == (mydefine + 1) && x > 3) { }<br>
 }<br>
<br>
+// Don't generate a warning here.<br>
+void array_out_of_bounds() {<br>
+  int x;<br>
+  int buffer[4];<br>
+  x = (-7 > 0) ? (buffer[-7]) : 0;<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>