diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 7 | ||||
-rw-r--r-- | lib/CodeGen/CGBlocks.h | 6 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 14 |
3 files changed, 17 insertions, 10 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 44e0833daf..33646871e0 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -311,11 +311,10 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) { } const BlockDeclRefExpr *BDRE = cast<BlockDeclRefExpr>(E); + Note.RequiresCopying = BlockRequiresCopying(BDRE); + const ValueDecl *VD = BDRE->getDecl(); QualType T = VD->getType(); - - Note.RequiresCopying = BlockRequiresCopying(T); - if (BDRE->isByRef()) { Note.flag = BLOCK_FIELD_IS_BYREF; if (T.isObjCGCWeak()) @@ -563,7 +562,7 @@ void CodeGenFunction::AllocateBlockDecl(const BlockDeclRefExpr *E) { // Don't run the expensive check, unless we have to. if (!BlockHasCopyDispose) if (E->isByRef() - || BlockRequiresCopying(E->getType())) + || BlockRequiresCopying(E)) BlockHasCopyDispose = true; const ValueDecl *D = cast<ValueDecl>(E->getDecl()); diff --git a/lib/CodeGen/CGBlocks.h b/lib/CodeGen/CGBlocks.h index 743e3c83be..ce721a4640 100644 --- a/lib/CodeGen/CGBlocks.h +++ b/lib/CodeGen/CGBlocks.h @@ -103,6 +103,9 @@ public: bool BlockRequiresCopying(QualType Ty) { return getContext().BlockRequiresCopying(Ty); } + bool BlockRequiresCopying(const BlockDeclRefExpr *E) + { return E->getCopyConstructorExpr() != 0 || + getContext().BlockRequiresCopying(E->getType()); } }; class BlockFunction : public BlockBase { @@ -197,6 +200,9 @@ public: bool BlockRequiresCopying(QualType Ty) { return getContext().BlockRequiresCopying(Ty); } + bool BlockRequiresCopying(const BlockDeclRefExpr *E) + { return E->getCopyConstructorExpr() != 0 || + getContext().BlockRequiresCopying(E->getType()); } }; } // end namespace CodeGen diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 790f8831d2..8da3846f69 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1911,16 +1911,18 @@ Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS, Expr *E = new (Context) DeclRefExpr(const_cast<ValueDecl*>(BDRE->getDecl()), T, SourceLocation()); - - ExprResult Res = PerformCopyInitialization( + if (T->getAs<RecordType>()) + if (!T->isUnionType()) { + ExprResult Res = PerformCopyInitialization( InitializedEntity::InitializeBlock(VD->getLocation(), T, false), SourceLocation(), Owned(E)); - if (!Res.isInvalid()) { - Res = MaybeCreateCXXExprWithTemporaries(Res.get()); - Expr *Init = Res.takeAs<Expr>(); - BDRE->setCopyConstructorExpr(Init); + if (!Res.isInvalid()) { + Res = MaybeCreateCXXExprWithTemporaries(Res.get()); + Expr *Init = Res.takeAs<Expr>(); + BDRE->setCopyConstructorExpr(Init); + } } } } |