Keep track of the set of array index variables we use when we
synthesize a by-copy captured array in a lambda. This information will
be needed by IR generation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150396 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp
index 257a507..fcd4508 100644
--- a/lib/AST/DeclCXX.cpp
+++ b/lib/AST/DeclCXX.cpp
@@ -38,13 +38,23 @@
void CXXRecordDecl::LambdaDefinitionData::allocateExtra(
ArrayRef<LambdaExpr::Capture> Captures,
ArrayRef<Expr *> CaptureInits,
+ ArrayRef<VarDecl *> ArrayIndexVars,
+ ArrayRef<unsigned> ArrayIndexStarts,
Stmt *Body) {
NumCaptures = Captures.size();
NumExplicitCaptures = 0;
ASTContext &Context = Definition->getASTContext();
+ unsigned ArrayIndexSize = 0;
+ if (ArrayIndexVars.size() > 0) {
+ HasArrayIndexVars = true;
+ ArrayIndexSize = sizeof(unsigned) * (Captures.size() + 1)
+ + sizeof(VarDecl *) * ArrayIndexVars.size();
+ }
+
this->Extra = Context.Allocate(sizeof(Capture) * Captures.size() +
- sizeof(Stmt*) * (Captures.size() + 1));
+ sizeof(Stmt*) * (Captures.size() + 1) +
+ ArrayIndexSize);
// Copy captures.
Capture *ToCapture = getCaptures();
@@ -62,6 +72,15 @@
// Copy the body of the lambda.
*Stored++ = Body;
+
+ if (ArrayIndexVars.size() > 0) {
+ assert(ArrayIndexStarts.size() == Captures.size());
+ memcpy(getArrayIndexVars(), ArrayIndexVars.data(),
+ sizeof(VarDecl *) * ArrayIndexVars.size());
+ memcpy(getArrayIndexStarts(), ArrayIndexStarts.data(),
+ sizeof(unsigned) * Captures.size());
+ getArrayIndexStarts()[Captures.size()] = ArrayIndexVars.size();
+ }
}