Thanks for the work here - but this bug is a duplicate of this: https://llvm.org/bugs/show_bug.cgi?id=27507, which unearthed some other subtle bugs with the cv capture of *this by copy. I've submitted a patch for review here: http://reviews.llvm.org/D19783 that addresses both issues - about 2-3 weeks ago - given the nastiness of this bug, the fact that it was introduced by one of my patches and that there is now a second report of the bug - and that I feel reasonably good about the fix - I'll commit this patch before the weekend, unless Richard raises an issue.
Faisal Vali On Tue, May 17, 2016 at 11:23 PM, Taewook Oh <t...@fb.com> 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@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits