[PATCH] D20349: Fix a clang bug in lambda capture of 'this'

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Tue May 17 23:07:21 PDT 2016


The patch'll need a test case (in clang/tests) - I've not looked at the
change/have much opinion there, just suggesting adding a test at minimum so
when someone does come to review it it's more complete/closer to/ready to
commit.

On Tue, May 17, 2016 at 9:23 PM, Taewook Oh via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> twoh created this revision.
> twoh added reviewers: faisalv, rsmith.
> twoh added a subscriber: cfe-commits.
>
> (This is a fix for Bug 27797 https://llvm.org/bugs/show_bug.cgi?id=27797).
>
> Currently when RebuildLambdaScopeInfo() function in lib/Sema/SemaDecl.cpp
> observes lambda capturing 'this', it calls Sema::getCurrentThisType() to
> get the type of 'this'. However, clang (revision 269789) crashes with an
> assertion failure inside Sema::getCurrentThisType() if template
> instantiation creates nested lambdas. Inside, Sema::getCurrentThisType(),
> there is an assertion saying that getCurLambda() never returns nullptr, but
> nest lambdas created by template instantiation makes getCurLambda() returns
> nullptr.
>
> Actually, even without the assertion failure, calling
> Sema::getCurrentThisType() from RebuildLambdaScopeInfo() seems wrong. When
> there are nested lambdas, what is required from Sema::getCurrentThisType()
> is a type of 'this' for nesting lambda, while what is supposed to be
> returned from Sema::getCurrentThisType() is a type of 'this' for nested
> lambda.
>
> This patch addresses this issue and makes RebuildLambdaScopeInfo() compute
> the correct 'this' type.
>
> http://reviews.llvm.org/D20349
>
> Files:
>   lib/Sema/SemaDecl.cpp
>
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp
> +++ lib/Sema/SemaDecl.cpp
> @@ -11109,8 +11109,16 @@
>            CaptureType, /*Expr*/ nullptr);
>
>      } else if (C.capturesThis()) {
> +      QualType ThisTy = CallOperator->getThisType(S.Context);
> +      QualType BaseTy = ThisTy->getPointeeType();
> +      if (C.getCaptureKind() == LCK_StarThis &&
> +          CallOperator->isConst() &&
> +          !BaseTy.isConstQualified()) {
> +        BaseTy.addConst();
> +        ThisTy = S.Context.getPointerType(BaseTy);
> +      }
>        LSI->addThisCapture(/*Nested*/ false, C.getLocation(),
> -                              S.getCurrentThisType(), /*Expr*/ nullptr,
> +                              ThisTy, /*Expr*/ nullptr,
>                                C.getCaptureKind() == LCK_StarThis);
>      } else {
>        LSI->addVLATypeCapture(C.getLocation(), I->getType());
>
>
>
> _______________________________________________
> 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/20160517/1d8a2a04/attachment.html>


More information about the cfe-commits mailing list