[PATCH] Fix PR17877

Richard Smith richard at metafoo.co.uk
Mon Nov 11 19:30:26 PST 2013


LGTM as a solution to the immediate issue, at least.


On Mon, Nov 11, 2013 at 7:10 PM, Faisal Vali <faisalv at yahoo.com> wrote:

> Hi rsmith, doug.gregor,
>
> A quick fix to the bug introduced by generic-lambda-capturing that broke
> libc++.
> See http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-November/033369.htmlfor discussion on cfe-dev.
>
> This fix explicitly checks whether we are within the declcontext of a
> lambda's call operator - which is what I had intended to be true (and
> assumed would be true if getCurLambda returns a valid pointer) before
> checking whether we should check to see if the lambda can capture.
>
> A deeper fix (that addresses why getCurLambda() returns a valid pointer
> when perhaps it shouldn't?) - as proposed by Richard Smith in
> http://llvm.org/bugs/show_bug.cgi?id=17877 - has been suggested as a
> FIXME.
>
> Will try and implement that at a later date - figured it is prolly
> important to not leave libc++ broken for too long (sorry about that).
>
>
>
>
> http://llvm-reviews.chandlerc.com/D2144
>
> Files:
>   lib/Sema/SemaExprCXX.cpp
>
> Index: lib/Sema/SemaExprCXX.cpp
> ===================================================================
> --- lib/Sema/SemaExprCXX.cpp
> +++ lib/Sema/SemaExprCXX.cpp
> @@ -5988,9 +5988,24 @@
>    //   full-expression +n + ({ 0; }); ends, but it's too late for us to
> see that
>    //   we need to capture n after all.
>
> -  LambdaScopeInfo *const CurrentLSI = getCurLambda();
> -  if (CurrentLSI && CurrentLSI->hasPotentialCaptures() &&
> -      !FullExpr.isInvalid())
> +  LambdaScopeInfo *const CurrentLSI = getCurLambda();
> +  // FIXME: PR 17877 showed that CurrentLSI can exist even when the
> +  // CurContext is not a lambda call operator. Refer to that Bug Report
> +  // for an example of the code that might cause this asynchrony.
> +  // By checking whether we are in the context of a lambda's call operator
> +  // we can fix the bug (we only need to check whether we need to capture
> +  // if we are within a lambda's body); but per the comments in that
> +  // PR, a proper fix would entail :
> +  //   "Alternative suggestion:
> +  //   - Add to Sema an integer holding the smallest (outermost) scope
> +  //     index that we are *lexically* within, and save/restore/set to
> +  //     FunctionScopes.size() in InstantiatingTemplate's
> +  //     constructor/destructor.
> +  //  - Teach the handful of places that iterate over FunctionScopes to
> +  //    stop at the outermost enclosing lexical scope."
> +  const bool IsInLambdaDeclContext = isLambdaCallOperator(CurContext);
> +  if (IsInLambdaDeclContext && CurrentLSI &&
> +      CurrentLSI->hasPotentialCaptures() && !FullExpr.isInvalid())
>      CheckLambdaCaptures(FE, CurrentLSI, *this);
>    return MaybeCreateExprWithCleanups(FullExpr);
>  }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131111/999cb7ef/attachment.html>


More information about the cfe-commits mailing list