summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-02-14 17:54:36 +0000
committerDouglas Gregor <dgregor@apple.com>2012-02-14 17:54:36 +0000
commit99ae806aff77f7e6487eb9fb4857e2ac244010b5 (patch)
tree69f5ac5a5c0583f358b47cf2447827f19b0dd62b /clang/lib/AST/ExprCXX.cpp
parentb1ba885b4945a701e5a70b3190adb6b8c9a24746 (diff)
downloadbcm5719-llvm-99ae806aff77f7e6487eb9fb4857e2ac244010b5.tar.gz
bcm5719-llvm-99ae806aff77f7e6487eb9fb4857e2ac244010b5.zip
Implement AST (de-)serialization for lambda expressions.
llvm-svn: 150491
Diffstat (limited to 'clang/lib/AST/ExprCXX.cpp')
-rw-r--r--clang/lib/AST/ExprCXX.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index 6825390772d..e09d88091be 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -832,6 +832,16 @@ LambdaExpr *LambdaExpr::Create(ASTContext &Context,
ClosingBrace);
}
+LambdaExpr *LambdaExpr::CreateDeserialized(ASTContext &C, unsigned NumCaptures,
+ unsigned NumArrayIndexVars) {
+ unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (NumCaptures + 1);
+ if (NumArrayIndexVars)
+ Size += sizeof(VarDecl) * NumArrayIndexVars
+ + sizeof(unsigned) * (NumCaptures + 1);
+ void *Mem = C.Allocate(Size);
+ return new (Mem) LambdaExpr(EmptyShell(), NumCaptures, NumArrayIndexVars > 0);
+}
+
LambdaExpr::capture_iterator LambdaExpr::capture_begin() const {
return getLambdaClass()->getLambdaData().Captures;
}
@@ -886,6 +896,13 @@ CXXMethodDecl *LambdaExpr::getCallOperator() const {
return Result;
}
+CompoundStmt *LambdaExpr::getBody() const {
+ if (!getStoredStmts()[NumCaptures])
+ getStoredStmts()[NumCaptures] = getCallOperator()->getBody();
+
+ return reinterpret_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]);
+}
+
bool LambdaExpr::isMutable() const {
return (getCallOperator()->getTypeQualifiers() & Qualifiers::Const) == 0;
}
OpenPOWER on IntegriCloud