r302037 - DiagnosticsEngine should clear DelayedDiagID before reporting the

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed May 3 14:28:34 PDT 2017


On 3 May 2017 at 08:41, Alex Lorenz via cfe-commits <
cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170503/8b2fa40f/attachment.html>


More information about the cfe-commits mailing list