diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 9 | ||||
-rw-r--r-- | clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp | 4 |
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&"); + }(); } |