diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-05-16 06:20:58 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-05-16 06:20:58 +0000 |
| commit | ba71c085234044f8291b82749552a79d01f99631 (patch) | |
| tree | ad88c0f301afad274d85c38231e034b26b8bd300 /clang/lib/Sema/SemaExpr.cpp | |
| parent | ad9971d793e26c6d2ea28353f5b4dc6a2ee19833 (diff) | |
| download | bcm5719-llvm-ba71c085234044f8291b82749552a79d01f99631.tar.gz bcm5719-llvm-ba71c085234044f8291b82749552a79d01f99631.zip | |
First pass of semantic analysis for init-captures: check the initializer, build
a FieldDecl from it, and propagate both into the closure type and the
LambdaExpr.
You can't do much useful with them yet -- you can't use them within the body
of the lambda, because we don't have a representation for "the this of the
lambda, not the this of the enclosing context". We also don't have support or a
representation for a nested capture of an init-capture yet, which was intended
to work despite not being allowed by the current standard wording.
llvm-svn: 181985
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index fa2bfd260b9..8c612b42ca0 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -9932,7 +9932,7 @@ ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, if (Cap.isThisCapture()) continue; BlockDecl::Capture NewCap(Cap.getVariable(), Cap.isBlockCapture(), - Cap.isNested(), Cap.getCopyExpr()); + Cap.isNested(), Cap.getInitExpr()); Captures.push_back(NewCap); } BSI->TheDecl->setCaptures(Context, Captures.begin(), Captures.end(), @@ -11144,17 +11144,18 @@ bool Sema::tryCaptureVariable(VarDecl *Var, SourceLocation Loc, cast<CapturingScopeInfo>(FunctionScopes[FunctionScopesIndex]); // Check whether we've already captured it. - if (CSI->CaptureMap.count(Var)) { + if (CSI->isCaptured(Var)) { + const CapturingScopeInfo::Capture &Cap = CSI->getCapture(Var); + // If we found a capture, any subcaptures are nested. Nested = true; // Retrieve the capture type for this variable. - CaptureType = CSI->getCapture(Var).getCaptureType(); + CaptureType = Cap.getCaptureType(); // Compute the type of an expression that refers to this variable. DeclRefType = CaptureType.getNonReferenceType(); - const CapturingScopeInfo::Capture &Cap = CSI->getCapture(Var); if (Cap.isCopyCapture() && !(isa<LambdaScopeInfo>(CSI) && cast<LambdaScopeInfo>(CSI)->Mutable)) DeclRefType.addConst(); |

