diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-02-14 00:00:48 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-02-14 00:00:48 +0000 |
commit | b4328233c159b56bcb9bb88a281f56793bd94235 (patch) | |
tree | 066a7e842845daa80baa9696ea2ca1e803ab8605 /clang/lib/Sema/TreeTransform.h | |
parent | 10cc45336d5b5fdcb66596a41b8d19de2834ad2f (diff) | |
download | bcm5719-llvm-b4328233c159b56bcb9bb88a281f56793bd94235.tar.gz bcm5719-llvm-b4328233c159b56bcb9bb88a281f56793bd94235.zip |
Link together the call operator produced from transforming a lambda
expression with the original call operator, so that we don't try to
separately instantiate the call operator. Test and tweak a few more
bits for template instantiation of lambda expressions.
llvm-svn: 150440
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index ba6ec82c810..a63b9c804ac 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -7672,6 +7672,13 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { E->getCallOperator()->getLocEnd()); getDerived().transformAttrs(E->getCallOperator(), CallOperator); + // FIXME: Instantiation-specific. + CallOperator->setInstantiationOfMemberFunction(E->getCallOperator(), + TSK_ImplicitInstantiation); + + // Introduce the context of the call operator. + Sema::ContextRAII SavedContext(getSema(), CallOperator); + // Enter the scope of the lambda. sema::LambdaScopeInfo *LSI = getSema().enterLambdaScope(CallOperator, E->getIntroducerRange(), @@ -7741,17 +7748,12 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { } // Instantiate the body of the lambda expression. - StmtResult Body; - { - Sema::ContextRAII SavedContext(getSema(), CallOperator); - - Body = getDerived().TransformStmt(E->getBody()); - if (Body.isInvalid()) { - getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, - /*IsInstantiation=*/true); - return ExprError(); - } - } + StmtResult Body = getDerived().TransformStmt(E->getBody()); + if (Body.isInvalid()) { + getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, + /*IsInstantiation=*/true); + return ExprError(); + } return getSema().ActOnLambdaExpr(E->getLocStart(), Body.take(), /*CurScope=*/0, |