diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-02-03 23:06:43 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-02-03 23:06:43 +0000 |
commit | cefc7b20fdb97b989163199e0849b4325e9b7804 (patch) | |
tree | fb864521510d5a871548a1fc87b11997cad0c452 /lib/Sema/SemaExpr.cpp | |
parent | b942cb24a060435b18fef5b43eb33d77afc0d03a (diff) |
Make explicit captures which cause implicit captures work correctly.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149719 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 8e196fbfe2..8c49c537c5 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -9453,7 +9453,8 @@ static bool shouldAddConstForScope(CapturingScopeInfo *CSI, VarDecl *VD) { // Check if the variable needs to be captured; if so, try to perform // the capture. // FIXME: Add support for explicit captures. -void Sema::TryCaptureVar(VarDecl *var, SourceLocation loc) { +void Sema::TryCaptureVar(VarDecl *var, SourceLocation loc, + TryCaptureKind Kind) { DeclContext *DC = CurContext; if (var->getDeclContext() == DC) return; if (!var->hasLocalStorage()) return; @@ -9536,7 +9537,12 @@ void Sema::TryCaptureVar(VarDecl *var, SourceLocation loc) { } bool byRef; - if (CSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_None) { + bool isInnermostCapture = (i == e - 1); + if (isInnermostCapture && Kind == TryCapture_ExplicitByVal) { + byRef = false; + } else if (isInnermostCapture && Kind == TryCapture_ExplicitByRef) { + byRef = true; + } else if (CSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_None) { // No capture-default Diag(loc, diag::err_lambda_impcap) << var->getDeclName(); Diag(var->getLocation(), diag::note_previous_decl) << var->getDeclName(); |