On 3 May 2017 at 08:41, Alex Lorenz via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> 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. > Thanks again! > 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(); > 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()). } > > 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; > +} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits