diff options
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Basic/DiagnosticIDs.cpp | 4 | ||||
-rw-r--r-- | clang/test/Index/KeepGoingWithLotsOfErrors.mm | 29 |
3 files changed, 36 insertions, 5 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 6bdef78c074..c355445dc1e 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -146,10 +146,9 @@ void DiagnosticsEngine::SetDelayedDiagnostic(unsigned DiagID, StringRef Arg1, } void DiagnosticsEngine::ReportDelayed() { - Report(DelayedDiagID) << DelayedDiagArg1 << DelayedDiagArg2; + unsigned ID = DelayedDiagID; DelayedDiagID = 0; - DelayedDiagArg1.clear(); - DelayedDiagArg2.clear(); + Report(ID) << DelayedDiagArg1 << DelayedDiagArg2; } void DiagnosticsEngine::DiagStateMap::appendFirst( @@ -420,11 +419,10 @@ bool DiagnosticsEngine::EmitCurrentDiagnostic(bool Force) { } // Clear out the current diagnostic object. - unsigned DiagID = CurDiagID; Clear(); // If there was a delayed diagnostic, emit it now. - if (!Force && DelayedDiagID && DelayedDiagID != DiagID) + if (!Force && DelayedDiagID) ReportDelayed(); return Emitted; diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index 2852b40026c..ce493c1e5ca 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -666,6 +666,10 @@ bool DiagnosticIDs::ProcessDiag(DiagnosticsEngine &Diag) const { } } + // Make sure we set FatalErrorOccurred to ensure that the notes from the + // diagnostic that caused `fatal_too_many_errors` won't be emitted. + if (Diag.CurDiagID == diag::fatal_too_many_errors) + Diag.FatalErrorOccurred = true; // Finally, report it. EmitDiag(Diag, DiagLevel); return true; diff --git a/clang/test/Index/KeepGoingWithLotsOfErrors.mm b/clang/test/Index/KeepGoingWithLotsOfErrors.mm new file mode 100644 index 00000000000..078ea6e2ea1 --- /dev/null +++ b/clang/test/Index/KeepGoingWithLotsOfErrors.mm @@ -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 recursion: + ++(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; +} |