зеркало из https://github.com/microsoft/clang-1.git
Make sure Sema creates a field for 'this' captures. (Doug, please double-check that this is correct.)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150292 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
b70a3bad9c
Коммит
668165ab1e
|
@ -156,8 +156,8 @@ public:
|
|||
CopyExprAndNested(Cpy, isNested) {}
|
||||
|
||||
enum IsThisCapture { ThisCapture };
|
||||
Capture(IsThisCapture, bool isNested, SourceLocation Loc)
|
||||
: VarAndKind(0, Cap_This), CopyExprAndNested(0, isNested), Loc(Loc) {
|
||||
Capture(IsThisCapture, bool isNested, SourceLocation Loc, Expr *Cpy)
|
||||
: VarAndKind(0, Cap_This), CopyExprAndNested(Cpy, isNested), Loc(Loc) {
|
||||
}
|
||||
|
||||
bool isThisCapture() const { return VarAndKind.getInt() == Cap_This; }
|
||||
|
@ -208,8 +208,8 @@ public:
|
|||
CaptureMap[Var] = Captures.size();
|
||||
}
|
||||
|
||||
void AddThisCapture(bool isNested, SourceLocation Loc) {
|
||||
Captures.push_back(Capture(Capture::ThisCapture, isNested, Loc));
|
||||
void AddThisCapture(bool isNested, SourceLocation Loc, Expr *Cpy) {
|
||||
Captures.push_back(Capture(Capture::ThisCapture, isNested, Loc, Cpy));
|
||||
CXXThisCaptureIndex = Captures.size();
|
||||
}
|
||||
|
||||
|
|
|
@ -707,8 +707,22 @@ void Sema::CheckCXXThisCapture(SourceLocation Loc, bool Explicit) {
|
|||
for (unsigned idx = FunctionScopes.size() - 1;
|
||||
NumClosures; --idx, --NumClosures) {
|
||||
CapturingScopeInfo *CSI = cast<CapturingScopeInfo>(FunctionScopes[idx]);
|
||||
Expr *ThisExpr = 0;
|
||||
if (LambdaScopeInfo *LSI = dyn_cast<LambdaScopeInfo>(CSI)) {
|
||||
// For lambda expressions, build a field and an initializing expression.
|
||||
QualType ThisTy = getCurrentThisType();
|
||||
CXXRecordDecl *Lambda = LSI->Lambda;
|
||||
FieldDecl *Field
|
||||
= FieldDecl::Create(Context, Lambda, Loc, Loc, 0, ThisTy,
|
||||
Context.getTrivialTypeSourceInfo(ThisTy, Loc),
|
||||
0, false, false);
|
||||
Field->setImplicit(true);
|
||||
Field->setAccess(AS_private);
|
||||
Lambda->addDecl(Field);
|
||||
ThisExpr = new (Context) CXXThisExpr(Loc, ThisTy, /*isImplicit=*/true);
|
||||
}
|
||||
bool isNested = NumClosures > 1;
|
||||
CSI->AddThisCapture(isNested, Loc);
|
||||
CSI->AddThisCapture(isNested, Loc, ThisExpr);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -55,3 +55,11 @@ void test_layout(char a, short b) {
|
|||
};
|
||||
static_assert(sizeof(x) == sizeof(ExpectedLayout), "Layout mismatch!");
|
||||
}
|
||||
|
||||
struct ExpectedThisLayout {
|
||||
ExpectedThisLayout* a;
|
||||
void f() {
|
||||
auto x = [this]() -> void {};
|
||||
static_assert(sizeof(x) == sizeof(ExpectedThisLayout), "Layout mismatch!");
|
||||
}
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче