[cfe-commits] r150088 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
Douglas Gregor
dgregor at apple.com
Wed Feb 8 12:56:50 PST 2012
Author: dgregor
Date: Wed Feb 8 14:56:50 2012
New Revision: 150088
URL: http://llvm.org/viewvc/llvm-project?rev=150088&view=rev
Log:
When computing the type of a local variable reference within a lambda,
only add 'const' for variables captured by copy in potentially
evaluated expressions of non-mutable lambdas. (The "by copy" part was
missing).
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=150088&r1=150087&r2=150088&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Feb 8 14:56:50 2012
@@ -2094,6 +2094,15 @@
return S.getCurBlock() != 0;
}
+/// \brief Determine whether the given lambda would capture the given
+/// variable by copy.
+static bool willCaptureByCopy(LambdaScopeInfo *LSI, VarDecl *Var) {
+ if (LSI->isCaptured(Var))
+ return LSI->getCapture(Var).isCopyCapture();
+
+ return LSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_LambdaByval;
+}
+
static bool shouldAddConstQualToVarRef(ValueDecl *D, Sema &S) {
VarDecl *var = dyn_cast<VarDecl>(D);
if (!var)
@@ -2117,7 +2126,8 @@
// about decltype hints that it might apply in unevaluated contexts
// as well... and there's precent in our blocks implementation.
return !LSI->Mutable &&
- S.ExprEvalContexts.back().Context != Sema::Unevaluated;
+ S.ExprEvalContexts.back().Context != Sema::Unevaluated &&
+ willCaptureByCopy(LSI, var);
}
static ExprResult BuildBlockDeclRefExpr(Sema &S, ValueDecl *VD,
Modified: cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp?rev=150088&r1=150087&r2=150088&view=diff
==============================================================================
--- cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp (original)
+++ cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp Wed Feb 8 14:56:50 2012
@@ -6,7 +6,40 @@
// expected-error{{lambda expressions are not supported yet}}
}
-// FIXME: Also check translation of captured vars to data members,
-// most of which isn't in the AST.
+// Check that we get the right types of captured variables (the semantic-analysis part of
+int &check_const_int(int&);
+float &check_const_int(const int&);
+
+void test_capture_constness(int i, const int ic) {
+ [i,ic] ()->void { // expected-error{{lambda expressions are not supported yet}}
+ float &fr1 = check_const_int(i);
+ float &fr2 = check_const_int(ic);
+ };
+
+ [=] ()->void { // expected-error{{lambda expressions are not supported yet}}
+ float &fr1 = check_const_int(i);
+ float &fr2 = check_const_int(ic);
+ };
+
+ [i,ic] () mutable ->void { // expected-error{{lambda expressions are not supported yet}}
+ int &ir = check_const_int(i);
+ float &fr = check_const_int(ic);
+ };
+
+ [=] () mutable ->void { // expected-error{{lambda expressions are not supported yet}}
+ int &ir = check_const_int(i);
+ float &fr = check_const_int(ic);
+ };
+
+ [&i,&ic] ()->void { // expected-error{{lambda expressions are not supported yet}}
+ int &ir = check_const_int(i);
+ float &fr = check_const_int(ic);
+ };
+
+ [&] ()->void { // expected-error{{lambda expressions are not supported yet}}
+ int &ir = check_const_int(i);
+ float &fr = check_const_int(ic);
+ };
+}
More information about the cfe-commits
mailing list