diff options
author | Reid Kleckner <rnk@google.com> | 2018-03-08 01:12:22 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2018-03-08 01:12:22 +0000 |
commit | 8d485b845b1dc8cdd78c7c4028be94f2abadbf50 (patch) | |
tree | dfa1abc2972cd5ff48b111643d9142a9cad62869 /clang/lib/Sema/SemaExprCXX.cpp | |
parent | 5d3310208ae811396ca0cf256f96d4234ce5ae75 (diff) | |
download | bcm5719-llvm-8d485b845b1dc8cdd78c7c4028be94f2abadbf50.tar.gz bcm5719-llvm-8d485b845b1dc8cdd78c7c4028be94f2abadbf50.zip |
Revert "[Sema] Make getCurFunction() return null outside function parsing"
This reverts r326965. It seems to have caused repeating test failures in
clang/test/Sema/diagnose_if.c on some buildbots.
I cannot reproduce the problem, and it's not immediately obvious what
the problem is, so let's revert to green.
llvm-svn: 326974
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 4baf52f5b78..d3ab003a339 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1114,9 +1114,8 @@ bool Sema::CheckCXXThisCapture(SourceLocation Loc, const bool Explicit, assert((!ByCopy || Explicit) && "cannot implicitly capture *this by value"); - const int MaxFunctionScopesIndex = FunctionScopeIndexToStopAt - ? *FunctionScopeIndexToStopAt - : FunctionScopes.size() - 1; + const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt ? + *FunctionScopeIndexToStopAt : FunctionScopes.size() - 1; // Check that we can capture the *enclosing object* (referred to by '*this') // by the capturing-entity/closure (lambda/block/etc) at @@ -1142,7 +1141,7 @@ bool Sema::CheckCXXThisCapture(SourceLocation Loc, const bool Explicit, unsigned NumCapturingClosures = 0; - for (int idx = MaxFunctionScopesIndex; idx >= 0; idx--) { + for (unsigned idx = MaxFunctionScopesIndex; idx != 0; idx--) { if (CapturingScopeInfo *CSI = dyn_cast<CapturingScopeInfo>(FunctionScopes[idx])) { if (CSI->CXXThisCaptureIndex != 0) { @@ -1197,8 +1196,8 @@ bool Sema::CheckCXXThisCapture(SourceLocation Loc, const bool Explicit, // FIXME: We need to delay this marking in PotentiallyPotentiallyEvaluated // contexts. QualType ThisTy = getCurrentThisType(); - for (int idx = MaxFunctionScopesIndex; NumCapturingClosures; - --idx, --NumCapturingClosures) { + for (unsigned idx = MaxFunctionScopesIndex; NumCapturingClosures; + --idx, --NumCapturingClosures) { CapturingScopeInfo *CSI = cast<CapturingScopeInfo>(FunctionScopes[idx]); Expr *ThisExpr = nullptr; @@ -7177,6 +7176,9 @@ static void CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures( const bool IsFullExprInstantiationDependent = FE->isInstantiationDependent(); + ArrayRef<const FunctionScopeInfo *> FunctionScopesArrayRef( + S.FunctionScopes.data(), S.FunctionScopes.size()); + // All the potentially captureable variables in the current nested // lambda (within a generic outer lambda), must be captured by an // outer lambda that is enclosed within a non-dependent context. @@ -7205,7 +7207,7 @@ static void CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures( // capture the variable in that lambda (and all its enclosing lambdas). if (const Optional<unsigned> Index = getStackIndexOfNearestEnclosingCaptureCapableLambda( - S.FunctionScopes, Var, S)) { + FunctionScopesArrayRef, Var, S)) { const unsigned FunctionScopeIndexOfCapturableLambda = Index.getValue(); MarkVarDeclODRUsed(Var, VarExpr->getExprLoc(), S, &FunctionScopeIndexOfCapturableLambda); @@ -7241,7 +7243,7 @@ static void CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures( // 'this' in that lambda (and all its enclosing lambdas). if (const Optional<unsigned> Index = getStackIndexOfNearestEnclosingCaptureCapableLambda( - S.FunctionScopes, /*0 is 'this'*/ nullptr, S)) { + FunctionScopesArrayRef, /*0 is 'this'*/ nullptr, S)) { const unsigned FunctionScopeIndexOfCapturableLambda = Index.getValue(); S.CheckCXXThisCapture(CurrentLSI->PotentialThisCaptureLocation, /*Explicit*/ false, /*BuildAndDiagnose*/ true, |