Only pop the expression evaluation context corresponding to a lambda
expression after we've finished the function body of the corresponding function call operator. Otherwise, ActOnFinishFunctionBody() will see the (unfinished) evaluation context of the lambda expression itself. Fixes PR12031. llvm-svn: 151082
This commit is contained in:
parent
9a2b7e820c
commit
5dbc14f47e
|
@ -511,10 +511,6 @@ ExprResult Sema::ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body,
|
|||
llvm::Optional<unsigned> ManglingNumber,
|
||||
Decl *ContextDecl,
|
||||
bool IsInstantiation) {
|
||||
// Leave the expression-evaluation context.
|
||||
DiscardCleanupsInEvaluationContext();
|
||||
PopExpressionEvaluationContext();
|
||||
|
||||
// Collect information from the lambda scope.
|
||||
llvm::SmallVector<LambdaExpr::Capture, 4> Captures;
|
||||
llvm::SmallVector<Expr *, 4> CaptureInits;
|
||||
|
@ -631,6 +627,7 @@ ExprResult Sema::ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body,
|
|||
ActOnFinishFunctionBody(CallOperator, Body, IsInstantiation);
|
||||
CallOperator->setLexicalDeclContext(Class);
|
||||
Class->addDecl(CallOperator);
|
||||
PopExpressionEvaluationContext();
|
||||
|
||||
// C++11 [expr.prim.lambda]p6:
|
||||
// The closure type for a lambda-expression with no lambda-capture
|
||||
|
@ -654,7 +651,6 @@ ExprResult Sema::ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body,
|
|||
ActOnFields(0, Class->getLocation(), Class, Fields,
|
||||
SourceLocation(), SourceLocation(), 0);
|
||||
CheckCompletedCXXClass(Class);
|
||||
|
||||
}
|
||||
|
||||
if (LambdaExprNeedsCleanups)
|
||||
|
|
|
@ -87,3 +87,17 @@ namespace ImplicitCapture {
|
|||
[]() { return h; }; // expected-error {{variable 'h' cannot be implicitly captured in a lambda with no capture-default specified}} expected-note {{lambda expression begins here}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace PR12031 {
|
||||
struct X {
|
||||
template<typename T>
|
||||
X(const T&);
|
||||
~X();
|
||||
};
|
||||
|
||||
void f(int i, X x);
|
||||
void g() {
|
||||
const int v = 10;
|
||||
f(v, [](){});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue