aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaType.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-02-18 05:51:20 +0000
committerDouglas Gregor <dgregor@apple.com>2012-02-18 05:51:20 +0000
commit68932845a432d2a1dbbc57a84fd85bbb37c90487 (patch)
tree135bedbb565cfe47f8fc84749b471eae7821f674 /lib/Sema/SemaType.cpp
parentb78ae9716576399145786b93f687943f8b197170 (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.cpp39
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);
}
}
}