diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-02-16 01:06:16 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-02-16 01:06:16 +0000 |
commit | f6e2e0291b8964ed41b4325e21dd90b86e791f10 (patch) | |
tree | c630fad2fe486d3f2d2d3cfd815937fd52e71dd8 /lib/AST/DeclCXX.cpp | |
parent | b49bd27b334a6c4e3bf9d810a7d5b022578f1194 (diff) |
Implicitly define a lambda's conversion functions (to function
pointers and block pointers). We use dummy definitions to keep the
invariant that an implicit, used definition has a body; IR generation
will substitute the actual contents, since they can't be represented
as C++.
For the block pointer case, compute the copy-initialization needed to
capture the lambda object in the block, which IR generation will need
later.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150645 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclCXX.cpp')
-rw-r--r-- | lib/AST/DeclCXX.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 5b9ab4ff5c..b5b3f12f5e 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -1759,6 +1759,21 @@ CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD, EndLocation); } +bool CXXConversionDecl::isLambdaToBlockPointerConversion() const { + return isImplicit() && getParent()->isLambda() && + getConversionType()->isBlockPointerType(); +} + +Expr *CXXConversionDecl::getLambdaToBlockPointerCopyInit() const { + assert(isLambdaToBlockPointerConversion()); + return getASTContext().LambdaBlockPointerInits[this]; +} + +void CXXConversionDecl::setLambdaToBlockPointerCopyInit(Expr *Init) { + assert(isLambdaToBlockPointerConversion()); + getASTContext().LambdaBlockPointerInits[this] = Init; +} + void LinkageSpecDecl::anchor() { } LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, |