diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-02-01 01:18:43 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-02-01 01:18:43 +0000 |
commit | 93962e5360a43200faa70939571afc4fb9326cf7 (patch) | |
tree | fdf5ea75ff50a5501e38630d0e1c90aa832859f2 /lib/Sema/SemaExpr.cpp | |
parent | ee625afea71ef5a9c1e386564919b86915d96b0d (diff) |
Improve checking of explicit captures in a C++11 lambda expression:
- Actually building the var -> capture mapping properly (there was an off-by-one error)
- Keeping track of the source location of each capture
- Minor QoI improvements, e.g, highlighing the prior capture if
there are multiple captures, pointing at the variable declaration we
found if we reject it.
As part of this, add standard citations for the various semantic
checks we perform, and note where we're not performing those checks as
we should.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149462 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 0d929f1836..5de0388c06 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1263,7 +1263,8 @@ static CaptureResult propagateCapture(Sema &S, unsigned ValidScopeIndex, i != e; ++i) { BlockScopeInfo *innerBlock = cast<BlockScopeInfo>(S.FunctionScopes[i]); innerBlock->AddCapture(Cap.getVariable(), Cap.isReferenceCapture(), - /*nested*/ true, Cap.getCopyExpr()); + /*nested*/ true, Cap.getLocation(), + Cap.getCopyExpr()); } return Cap.isReferenceCapture() ? CR_CaptureByRef : CR_Capture; @@ -1377,7 +1378,7 @@ static CaptureResult shouldCaptureValueReference(Sema &S, SourceLocation loc, cast<BlockScopeInfo>(S.FunctionScopes[functionScopesIndex]); // Build a valid capture in this scope. - blockScope->AddCapture(var, byRef, /*nested*/ false, copyExpr); + blockScope->AddCapture(var, byRef, /*nested*/ false, loc, copyExpr); // Propagate that to inner captures if necessary. return propagateCapture(S, functionScopesIndex, |