summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaExpr.cpp9
-rw-r--r--clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp4
2 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 5202f96354d..c15102c4da2 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -9575,8 +9575,13 @@ static bool shouldAddConstForScope(CapturingScopeInfo *CSI, VarDecl *VD) {
return false;
if (isa<BlockScopeInfo>(CSI))
return true;
- if (LambdaScopeInfo *LSI = dyn_cast<LambdaScopeInfo>(CSI))
- return !LSI->Mutable;
+ if (LambdaScopeInfo *LSI = dyn_cast<LambdaScopeInfo>(CSI)) {
+ if (LSI->isCaptured(VD))
+ return LSI->getCapture(VD).isCopyCapture() && !LSI->Mutable;
+
+ return LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval &&
+ !LSI->Mutable;
+ }
return false;
}
diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp
index 561ead1271e..03cbe32ef4e 100644
--- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp
+++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp
@@ -38,4 +38,8 @@ void f3() {
"should be const float&");
}();
}();
+
+ [&i] {
+ static_assert(is_same<decltype((i)), int&>::value, "should be int&");
+ }();
}
OpenPOWER on IntegriCloud