[cfe-commits] r103028 - in /cfe/trunk: lib/CodeGen/CGObjC.cpp test/CodeGenObjCXX/ivar-objects.mm

Fariborz Jahanian fjahanian at apple.com
Tue May 4 12:29:32 PDT 2010


Author: fjahanian
Date: Tue May  4 14:29:32 2010
New Revision: 103028

URL: http://llvm.org/viewvc/llvm-project?rev=103028&view=rev
Log:
Fixes a code gen. crash when ivar object has trivial constructor.


Modified:
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/test/CodeGenObjCXX/ivar-objects.mm

Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=103028&r1=103027&r2=103028&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Tue May  4 14:29:32 2010
@@ -441,18 +441,20 @@
                                     LoadObjCSelf(), Ivar, 0);
       const RecordType *RT = FieldType->getAs<RecordType>();
       CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
-      if (Array) {
-        const llvm::Type *BasePtr = ConvertType(FieldType);
-        BasePtr = llvm::PointerType::getUnqual(BasePtr);
-        llvm::Value *BaseAddrPtr =
-          Builder.CreateBitCast(LV.getAddress(), BasePtr);
-        EmitCXXAggrDestructorCall(FieldClassDecl->getDestructor(getContext()),
-                                  Array, BaseAddrPtr);
-      }
-      else 
-        EmitCXXDestructorCall(FieldClassDecl->getDestructor(CGM.getContext()),
-                              Dtor_Complete, /*ForVirtualBase=*/false,
-                              LV.getAddress());
+      CXXDestructorDecl *Dtor = FieldClassDecl->getDestructor(getContext());
+      if (!Dtor->isTrivial())
+        if (Array) {
+          const llvm::Type *BasePtr = ConvertType(FieldType);
+          BasePtr = llvm::PointerType::getUnqual(BasePtr);
+          llvm::Value *BaseAddrPtr =
+            Builder.CreateBitCast(LV.getAddress(), BasePtr);
+          EmitCXXAggrDestructorCall(Dtor,
+                                    Array, BaseAddrPtr);
+        }
+        else 
+          EmitCXXDestructorCall(Dtor,
+                                Dtor_Complete, /*ForVirtualBase=*/false,
+                                LV.getAddress());
     }    
   }
   FinishFunction();

Modified: cfe/trunk/test/CodeGenObjCXX/ivar-objects.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/ivar-objects.mm?rev=103028&r1=103027&r2=103028&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjCXX/ivar-objects.mm (original)
+++ cfe/trunk/test/CodeGenObjCXX/ivar-objects.mm Tue May  4 14:29:32 2010
@@ -69,3 +69,18 @@
   [a release];
 }
 
+// rdar: // 7468090
+class S {
+public:
+	S& operator = (const S&);
+};
+
+ at interface I {
+  S position;
+}
+ at property(assign, nonatomic) S position;
+ at end
+
+ at implementation I
+	@synthesize position;
+ at end





More information about the cfe-commits mailing list