]> granicus.if.org Git - clang/commitdiff
Fixes synthesis of type for the object which holds info.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 17 Nov 2010 00:21:28 +0000 (00:21 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 17 Nov 2010 00:21:28 +0000 (00:21 +0000)
about a __block cxx object.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119411 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
lib/CodeGen/CGBlocks.cpp
lib/CodeGen/CGDecl.cpp

index 6823fa08d3d2c1d93acc0b1ef20a688abcc0310a..12a92f8ac6ff40d426815184f42c264863369b67 100644 (file)
@@ -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<RecordType>()) {
+      CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
+      return RD->hasConstCopyConstructor(*this);
+      
+    }
+  }
   return false;
 }
 
index e21664607cf519e4ebc8f40695e09dda45ca2363..c40cfaf6a97887b6d15ef6ddd9a1aaae63628aeb 100644 (file)
@@ -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, 
index cb0b09da5c672ffb2912d681731dcba1aaa5707b..7ccd80d0e8f6dc1e5fdce4fa61b0e6a5ef7987b3 100644 (file)
@@ -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;
     }