aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/CGBlocks.cpp7
-rw-r--r--lib/CodeGen/CGBlocks.h6
-rw-r--r--lib/Sema/SemaExpr.cpp14
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);
+ }
}
}
}