From d7dfec818b372b8e5d9addd0d2f224e824283d03 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 3 May 2017 15:41:16 +0000 Subject: [PATCH] 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 llvm-svn: 302037 --- clang/lib/Basic/Diagnostic.cpp | 3 +- clang/test/Index/KeepGoingWithLotsOfErrors.mm | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 clang/test/Index/KeepGoingWithLotsOfErrors.mm diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 6bdef78c074f..2cd400dbd71f 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -146,8 +146,9 @@ void DiagnosticsEngine::SetDelayedDiagnostic(unsigned DiagID, StringRef Arg1, } void DiagnosticsEngine::ReportDelayed() { - Report(DelayedDiagID) << DelayedDiagArg1 << DelayedDiagArg2; + unsigned ID = DelayedDiagID; DelayedDiagID = 0; + Report(ID) << DelayedDiagArg1 << DelayedDiagArg2; DelayedDiagArg1.clear(); DelayedDiagArg2.clear(); } diff --git a/clang/test/Index/KeepGoingWithLotsOfErrors.mm b/clang/test/Index/KeepGoingWithLotsOfErrors.mm new file mode 100644 index 000000000000..014461725bd0 --- /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 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; +}