[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