aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-02-03 23:06:43 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-02-03 23:06:43 +0000
commitcefc7b20fdb97b989163199e0849b4325e9b7804 (patch)
treefb864521510d5a871548a1fc87b11997cad0c452 /lib/Sema/SemaExpr.cpp
parentb942cb24a060435b18fef5b43eb33d77afc0d03a (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.cpp10
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();