diff options
Diffstat (limited to 'lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 5a3e1002c6..f789787b61 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -361,33 +361,21 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) { Builder.CreateStore(Loc, Addr); continue; } else { - E = new (getContext()) DeclRefExpr(const_cast<ValueDecl*>(VD), + if (BDRE->getCopyConstructorExpr()) + E = BDRE->getCopyConstructorExpr(); + else { + E = new (getContext()) DeclRefExpr(const_cast<ValueDecl*>(VD), VD->getType().getNonReferenceType(), SourceLocation()); - if (getContext().getLangOptions().CPlusPlus) { - if (VD->getType()->isReferenceType()) { - E = new (getContext()) - UnaryOperator(const_cast<Expr*>(E), UnaryOperator::AddrOf, - getContext().getPointerType(E->getType()), - SourceLocation()); - } - else { - QualType T = E->getType(); - if (const RecordType *RT = T->getAs<RecordType>()) { - CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl()); - if (!Record->hasTrivialCopyConstructor()) { - CXXConstructorDecl *D = Record->getCopyConstructor(getContext(), - 0); - Expr *Arg = const_cast<Expr*>(E); - E = CXXConstructExpr::Create(getContext(), T, D->getLocation(), - D, false, &Arg, 1, false, - CXXConstructExpr::CK_Complete); - } - } + if (VD->getType()->isReferenceType()) { + E = new (getContext()) + UnaryOperator(const_cast<Expr*>(E), UnaryOperator::AddrOf, + getContext().getPointerType(E->getType()), + SourceLocation()); + } } } } - } if (BDRE->isByRef()) { E = new (getContext()) |