diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-02-18 05:51:20 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-02-18 05:51:20 +0000 |
commit | 68932845a432d2a1dbbc57a84fd85bbb37c90487 (patch) | |
tree | 135bedbb565cfe47f8fc84749b471eae7821f674 /lib/Sema/SemaType.cpp | |
parent | b78ae9716576399145786b93f687943f8b197170 (diff) |
Unify our computation of the type of a captured reference to a
variable; it was previously duplicated, and one of the copies failed
to account for outer non-mutable lambda captures.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150872 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaType.cpp')
-rw-r--r-- | lib/Sema/SemaType.cpp | 39 |
1 files changed, 3 insertions, 36 deletions
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index a4b3d86d10..9c8a68b3da 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -4382,42 +4382,9 @@ static QualType getDecltypeForExpr(Sema &S, Expr *E) { if (isa<ParenExpr>(E)) { if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParens())) { if (VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl())) { - QualType T = Var->getType(); - unsigned FunctionScopesIndex; - bool Nested; - // Determine whether we can capture this variable. - if (S.canCaptureVariable(Var, DRE->getLocation(), - /*Explicit=*/false, /*Diagnose=*/false, - T, FunctionScopesIndex, Nested)) { - // Outer lambda scopes may have an effect on the type of a - // capture. Walk the captures outside-in to determine - // whether they can add 'const' to a capture by copy. - if (FunctionScopesIndex == S.FunctionScopes.size()) - --FunctionScopesIndex; - for (unsigned I = FunctionScopesIndex, - E = S.FunctionScopes.size(); - I != E; ++I) { - LambdaScopeInfo *LSI - = dyn_cast<LambdaScopeInfo>(S.FunctionScopes[I]); - if (!LSI) - continue; - - bool ByRef = false; - if (LSI->isCaptured(Var)) - ByRef = LSI->getCapture(Var).isReferenceCapture(); - else - ByRef = (LSI->ImpCaptureStyle - == CapturingScopeInfo::ImpCap_LambdaByref); - - T = S.getLambdaCaptureFieldType(T, ByRef); - if (!ByRef && !LSI->Mutable) - T.addConst(); - } - - if (!T->isReferenceType()) - T = S.Context.getLValueReferenceType(T); - return T; - } + QualType T = S.getCapturedDeclRefType(Var, DRE->getLocation()); + if (!T.isNull()) + return S.Context.getLValueReferenceType(T); } } } |