summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorFaisal Vali <faisalv@yahoo.com>2017-01-09 03:02:53 +0000
committerFaisal Vali <faisalv@yahoo.com>2017-01-09 03:02:53 +0000
commitc72a08c1f6f42d1999ca481aba75cd9a2ae2fc53 (patch)
treeeed393d95cf11792d9acc99782734a8a1a3fe181 /clang/lib/Sema/SemaExpr.cpp
parent6393afce978a30737e170150b7c34de4986cd2a8 (diff)
downloadbcm5719-llvm-c72a08c1f6f42d1999ca481aba75cd9a2ae2fc53.tar.gz
bcm5719-llvm-c72a08c1f6f42d1999ca481aba75cd9a2ae2fc53.zip
[cxx1z-constexpr-lambda] Implement constant evaluation of non-capturing lambda expressions.
Add a visitor for lambda expressions to RecordExprEvaluator in ExprConstant.cpp that creates an empty APValue of Struct type to represent the closure object. Additionally, add a LambdaExpr visitor to the TemporaryExprEvaluator that forwards constant evaluation of immediately-called-lambda-expressions to the one in RecordExprEvaluator through VisitConstructExpr. This patch supports: constexpr auto ID = [] (auto a) { return a; }; static_assert(ID(3.14) == 3.14); static_assert([](auto a) { return a + 1; }(10) == 11); Lambda captures are still not supported for constexpr lambdas. llvm-svn: 291416
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 023d6f678d5..65e8236952f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13097,8 +13097,10 @@ void Sema::PopExpressionEvaluationContext() {
// evaluate [...] a lambda-expression.
D = diag::err_lambda_in_constant_expression;
}
- for (const auto *L : Rec.Lambdas)
- Diag(L->getLocStart(), D);
+ // C++1z allows lambda expressions as core constant expressions.
+ if (Rec.Context != ConstantEvaluated || !getLangOpts().CPlusPlus1z)
+ for (const auto *L : Rec.Lambdas)
+ Diag(L->getLocStart(), D);
} else {
// Mark the capture expressions odr-used. This was deferred
// during lambda expression creation.
OpenPOWER on IntegriCloud