r302037 - DiagnosticsEngine should clear DelayedDiagID before reporting the

Alex Lorenz via cfe-commits cfe-commits at lists.llvm.org
Wed May 3 08:41:16 PDT 2017


Author: arphaman
Date: Wed May  3 10:41:16 2017
New Revision: 302037

URL: http://llvm.org/viewvc/llvm-project?rev=302037&view=rev
Log:
DiagnosticsEngine should clear DelayedDiagID before reporting the
delayed diagnostic

This avoids an infinite loop that was uncovered in one of our internal tests
by r301992. The testcase is the most reduced version of that auto-generated
test.

rdar://31962618

Added:
    cfe/trunk/test/Index/KeepGoingWithLotsOfErrors.mm
Modified:
    cfe/trunk/lib/Basic/Diagnostic.cpp

Modified: cfe/trunk/lib/Basic/Diagnostic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=302037&r1=302036&r2=302037&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/Diagnostic.cpp (original)
+++ cfe/trunk/lib/Basic/Diagnostic.cpp Wed May  3 10:41:16 2017
@@ -146,8 +146,9 @@ void DiagnosticsEngine::SetDelayedDiagno
 }
 
 void DiagnosticsEngine::ReportDelayed() {
-  Report(DelayedDiagID) << DelayedDiagArg1 << DelayedDiagArg2;
+  unsigned ID = DelayedDiagID;
   DelayedDiagID = 0;
+  Report(ID) << DelayedDiagArg1 << DelayedDiagArg2;
   DelayedDiagArg1.clear();
   DelayedDiagArg2.clear();
 }

Added: cfe/trunk/test/Index/KeepGoingWithLotsOfErrors.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/KeepGoingWithLotsOfErrors.mm?rev=302037&view=auto
==============================================================================
--- cfe/trunk/test/Index/KeepGoingWithLotsOfErrors.mm (added)
+++ cfe/trunk/test/Index/KeepGoingWithLotsOfErrors.mm Wed May  3 10:41:16 2017
@@ -0,0 +1,29 @@
+// RUN: env CINDEXTEST_KEEP_GOING=1 c-index-test -code-completion-at=%s:25:1 %s
+// Shouldn't crash!
+// This is the minimized test that triggered an infinite loop:
+
++(BOOL) onEntity {
+}
+
+-(const Object &) a_200 {
+}
+
+-(int) struct {
+}
+
+-(int) bar {
+}
+
+-(int) part {
+}
+
++(some_type_t) piece {
+}
+
++(void) z_Z_42 {
+  ([self onEntity: [] { 42];
+  } class: ^ {  }
+];
+  [super];
+  BOOL struct;
+}




More information about the cfe-commits mailing list