summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-02-13 16:35:30 +0000
committerDouglas Gregor <dgregor@apple.com>2012-02-13 16:35:30 +0000
commit54fcea6e168a0c2bf493404d006820f68a6a7d8b (patch)
tree2417fb2bf3d823aa0305b2e8549212fcbda8c04a /clang/lib/AST/ExprCXX.cpp
parentf299a55482ca10ab6ef45cf3551011da5af05084 (diff)
downloadbcm5719-llvm-54fcea6e168a0c2bf493404d006820f68a6a7d8b.tar.gz
bcm5719-llvm-54fcea6e168a0c2bf493404d006820f68a6a7d8b.zip
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. llvm-svn: 150396
Diffstat (limited to 'clang/lib/AST/ExprCXX.cpp')
-rw-r--r--clang/lib/AST/ExprCXX.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index 1f8a57a4e35..1e766ada239 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -753,6 +753,8 @@ LambdaExpr::LambdaExpr(QualType T,
ArrayRef<Capture> Captures,
bool ExplicitParams,
ArrayRef<Expr *> CaptureInits,
+ ArrayRef<VarDecl *> ArrayElementVars,
+ ArrayRef<unsigned> ArrayElementStarts,
SourceLocation ClosingBrace)
: Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary,
T->isDependentType(), T->isDependentType(), T->isDependentType(),
@@ -765,7 +767,8 @@ LambdaExpr::LambdaExpr(QualType T,
assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments");
CXXRecordDecl *Class = getLambdaClass();
CXXRecordDecl::LambdaDefinitionData &Data = Class->getLambdaData();
- Data.allocateExtra(Captures, CaptureInits, getCallOperator()->getBody());
+ Data.allocateExtra(Captures, CaptureInits, ArrayElementVars,
+ ArrayElementStarts, getCallOperator()->getBody());
// FIXME: Propagate "has unexpanded parameter pack" bit.
}
@@ -777,6 +780,8 @@ LambdaExpr *LambdaExpr::Create(ASTContext &Context,
ArrayRef<Capture> Captures,
bool ExplicitParams,
ArrayRef<Expr *> CaptureInits,
+ ArrayRef<VarDecl *> ArrayElementVars,
+ ArrayRef<unsigned> ArrayElementStarts,
SourceLocation ClosingBrace) {
// Determine the type of the expression (i.e., the type of the
// function object we're creating).
@@ -784,6 +789,7 @@ LambdaExpr *LambdaExpr::Create(ASTContext &Context,
return new (Context) LambdaExpr(T, IntroducerRange, CaptureDefault,
Captures, ExplicitParams, CaptureInits,
+ ArrayElementVars, ArrayElementStarts,
ClosingBrace);
}
@@ -826,6 +832,19 @@ LambdaExpr::capture_init_iterator LambdaExpr::capture_init_end() const {
return reinterpret_cast<Expr **>(Data.getStoredStmts() + Data.NumCaptures);
}
+ArrayRef<VarDecl *>
+LambdaExpr::getCaptureInitIndexVars(capture_init_iterator Iter) const {
+ CXXRecordDecl::LambdaDefinitionData &Data = getLambdaClass()->getLambdaData();
+ assert(Data.HasArrayIndexVars && "No array index-var data?");
+
+ unsigned Index = Iter - capture_init_begin();
+ assert(Index < Data.NumCaptures && "Capture index out-of-range");
+ VarDecl **IndexVars = Data.getArrayIndexVars();
+ unsigned *IndexStarts = Data.getArrayIndexStarts();
+ return ArrayRef<VarDecl *>(IndexVars + IndexStarts[Index],
+ IndexVars + IndexStarts[Index + 1]);
+}
+
CXXRecordDecl *LambdaExpr::getLambdaClass() const {
return getType()->getAsCXXRecordDecl();
}
OpenPOWER on IntegriCloud