diff options
-rw-r--r-- | include/clang/Sema/ScopeInfo.h | 22 | ||||
-rw-r--r-- | test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp | 15 |
2 files changed, 30 insertions, 7 deletions
diff --git a/include/clang/Sema/ScopeInfo.h b/include/clang/Sema/ScopeInfo.h index 0bfc6dcae6..c49dee7b41 100644 --- a/include/clang/Sema/ScopeInfo.h +++ b/include/clang/Sema/ScopeInfo.h @@ -420,11 +420,7 @@ public: } void addThisCapture(bool isNested, SourceLocation Loc, QualType CaptureType, - Expr *Cpy) { - Captures.push_back(Capture(Capture::ThisCapture, isNested, Loc, CaptureType, - Cpy)); - CXXThisCaptureIndex = Captures.size(); - } + Expr *Cpy); /// \brief Determine whether the C++ 'this' is captured. bool isCXXThisCaptured() const { return CXXThisCaptureIndex != 0; } @@ -535,12 +531,13 @@ public: void finishedExplicitCaptures() { NumExplicitCaptures = Captures.size(); } - - static bool classof(const FunctionScopeInfo *FSI) { + + static bool classof(const FunctionScopeInfo *FSI) { return FSI->Kind == SK_Lambda; } }; + FunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy() : Base(0, false), Property(0) {} @@ -558,6 +555,17 @@ void FunctionScopeInfo::recordUseOfWeak(const ExprT *E, bool IsRead) { Uses.push_back(WeakUseTy(E, IsRead)); } +inline void +CapturingScopeInfo::addThisCapture(bool isNested, SourceLocation Loc, + QualType CaptureType, Expr *Cpy) { + Captures.push_back(Capture(Capture::ThisCapture, isNested, Loc, CaptureType, + Cpy)); + CXXThisCaptureIndex = Captures.size(); + + if (LambdaScopeInfo *LSI = dyn_cast<LambdaScopeInfo>(this)) + LSI->ArrayIndexStarts.push_back(LSI->ArrayIndexVars.size()); +} + } // end namespace sema } // end namespace clang diff --git a/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp b/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp index 678fa4b964..6358215a55 100644 --- a/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp +++ b/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp @@ -73,3 +73,18 @@ struct ExpectedThisLayout { static_assert(sizeof(x) == sizeof(ExpectedThisLayout), "Layout mismatch!"); } }; + +struct CaptureArrayAndThis { + int value; + + void f() { + int array[3]; + [=]() -> int { + int result = value; + for (unsigned i = 0; i < 3; ++i) + result += array[i]; + return result; + }(); + } +}; + |