diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-02-10 23:30:22 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-02-10 23:30:22 +0000 |
commit | f0d495100cf488085328011481e131699e4ad496 (patch) | |
tree | 8552f35daf4eab55fc80f21d46100f3c1ca36537 /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | cb1d9f3706172a5d777ab2d50a34985a21f3218b (diff) | |
download | bcm5719-llvm-f0d495100cf488085328011481e131699e4ad496.tar.gz bcm5719-llvm-f0d495100cf488085328011481e131699e4ad496.zip |
Implement C++11 [expr.lambda.prim]p13, which prohibits lambdas in
default arguments if in fact those lambdas capture any entity.
llvm-svn: 150282
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index ec92470ae1f..a6d7d63b3a1 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -62,6 +62,7 @@ namespace { bool VisitExpr(Expr *Node); bool VisitDeclRefExpr(DeclRefExpr *DRE); bool VisitCXXThisExpr(CXXThisExpr *ThisE); + bool VisitLambdaExpr(LambdaExpr *Lambda); }; /// VisitExpr - Visit all of the children of this expression. @@ -111,6 +112,17 @@ namespace { diag::err_param_default_argument_references_this) << ThisE->getSourceRange(); } + + bool CheckDefaultArgumentVisitor::VisitLambdaExpr(LambdaExpr *Lambda) { + // C++11 [expr.lambda.prim]p13: + // A lambda-expression appearing in a default argument shall not + // implicitly or explicitly capture any entity. + if (Lambda->capture_begin() == Lambda->capture_end()) + return false; + + return S->Diag(Lambda->getLocStart(), + diag::err_lambda_capture_default_arg); + } } void Sema::ImplicitExceptionSpecification::CalledDecl(CXXMethodDecl *Method) { |