From: Fariborz Jahanian Date: Wed, 17 Nov 2010 00:21:28 +0000 (+0000) Subject: Fixes synthesis of type for the object which holds info. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e38be617437ccdcc180c5a49e447cbcd07539292;p=clang Fixes synthesis of type for the object which holds info. about a __block cxx object. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119411 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 6823fa08d3..12a92f8ac6 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -3282,6 +3282,13 @@ bool ASTContext::BlockRequiresCopying(QualType Ty) { return true; if (Ty->isObjCObjectPointerType()) return true; + if (getLangOptions().CPlusPlus) { + if (const RecordType *RT = Ty->getAs()) { + CXXRecordDecl *RD = cast(RT->getDecl()); + return RD->hasConstCopyConstructor(*this); + + } + } return false; } diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index e21664607c..c40cfaf6a9 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -1016,9 +1016,8 @@ GenerateCopyHelperFunction(const llvm::StructType *T, Srcv = Builder.CreateBitCast(Srcv, PtrStructTy); Srcv = Builder.CreateStructGEP(Srcv, CGF.getByRefValueLLVMField(VD), VD->getNameAsString()); - Dstv = Builder.CreateStructGEP(DstObj, index); - Dstv = Builder.CreateLoad(Dstv); - Dstv = Builder.CreateBitCast(Dstv, PtrStructTy); + + Dstv = Builder.CreateBitCast(DstObj, PtrStructTy); Dstv = Builder.CreateStructGEP(Dstv, CGF.getByRefValueLLVMField(VD), VD->getNameAsString()); CGF.EmitSynthesizedCXXCopyCtor(Dstv, Srcv, diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index cb0b09da5c..7ccd80d0e8 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -659,7 +659,8 @@ void CodeGenFunction::EmitAutoVarDecl(const VarDecl &D, if (Ty->isBlockPointerType()) { flag |= BLOCK_FIELD_IS_BLOCK; flags |= BLOCK_HAS_COPY_DISPOSE; - } else if (BlockRequiresCopying(Ty)) { + } else if (getContext().isObjCNSObjectType(Ty) || + Ty->isObjCObjectPointerType()) { flag |= BLOCK_FIELD_IS_OBJECT; flags |= BLOCK_HAS_COPY_DISPOSE; }