<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 3 May 2017 at 08:41, Alex Lorenz via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: arphaman<br>
Date: Wed May  3 10:41:16 2017<br>
New Revision: 302037<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=302037&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=302037&view=rev</a><br>
Log:<br>
DiagnosticsEngine should clear DelayedDiagID before reporting the<br>
delayed diagnostic<br>
<br>
This avoids an infinite loop that was uncovered in one of our internal tests<br>
by r301992. The testcase is the most reduced version of that auto-generated<br>
test.<br></blockquote><div><br></div><div>Thanks again!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
rdar://31962618<br>
<br>
Added:<br>
    cfe/trunk/test/Index/<wbr>KeepGoingWithLotsOfErrors.mm<br>
Modified:<br>
    cfe/trunk/lib/Basic/<wbr>Diagnostic.cpp<br>
<br>
Modified: cfe/trunk/lib/Basic/<wbr>Diagnostic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=302037&r1=302036&r2=302037&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Basic/<wbr>Diagnostic.cpp?rev=302037&r1=<wbr>302036&r2=302037&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Basic/<wbr>Diagnostic.cpp (original)<br>
+++ cfe/trunk/lib/Basic/<wbr>Diagnostic.cpp Wed May  3 10:41:16 2017<br>
@@ -146,8 +146,9 @@ void DiagnosticsEngine::<wbr>SetDelayedDiagno<br>
 }<br>
<br>
 void DiagnosticsEngine::<wbr>ReportDelayed() {<br>
-  Report(DelayedDiagID) << DelayedDiagArg1 << DelayedDiagArg2;<br>
+  unsigned ID = DelayedDiagID;<br>
   DelayedDiagID = 0;<br>
+  Report(ID) << DelayedDiagArg1 << DelayedDiagArg2;<br>
   DelayedDiagArg1.clear();<br>
   DelayedDiagArg2.clear();<br></blockquote><div><br></div><div>It looks like we can also remove these two clear() calls (which otherwise look wrong, since we don't own the delayed diagnostic information any more once we finish calling Report()).</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 }<br>
<br>
Added: cfe/trunk/test/Index/<wbr>KeepGoingWithLotsOfErrors.mm<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/KeepGoingWithLotsOfErrors.mm?rev=302037&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Index/<wbr>KeepGoingWithLotsOfErrors.mm?<wbr>rev=302037&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Index/<wbr>KeepGoingWithLotsOfErrors.mm (added)<br>
+++ cfe/trunk/test/Index/<wbr>KeepGoingWithLotsOfErrors.mm Wed May  3 10:41:16 2017<br>
@@ -0,0 +1,29 @@<br>
+// RUN: env CINDEXTEST_KEEP_GOING=1 c-index-test -code-completion-at=%s:25:1 %s<br>
+// Shouldn't crash!<br>
+// This is the minimized test that triggered an infinite loop:<br>
+<br>
++(BOOL) onEntity {<br>
+}<br>
+<br>
+-(const Object &) a_200 {<br>
+}<br>
+<br>
+-(int) struct {<br>
+}<br>
+<br>
+-(int) bar {<br>
+}<br>
+<br>
+-(int) part {<br>
+}<br>
+<br>
++(some_type_t) piece {<br>
+}<br>
+<br>
++(void) z_Z_42 {<br>
+  ([self onEntity: [] { 42];<br>
+  } class: ^ {  }<br>
+];<br>
+  [super];<br>
+  BOOL struct;<br>
+}<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>