]> granicus.if.org Git - clang/commitdiff
Code gen for aggregate-valued properties and a test case.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 26 Nov 2008 22:36:09 +0000 (22:36 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 26 Nov 2008 22:36:09 +0000 (22:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60122 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjC.cpp
test/CodeGenObjC/property-aggr-type.m [new file with mode: 0644]

index 1157f48d39d1793d1f1cffb52e32751b009dc5ea..e95d8e1e566f9fdbbb13335bfe10f7bb1a4e1cf2 100644 (file)
@@ -187,10 +187,13 @@ void CodeGenFunction::GenerateObjCGetter(const ObjCPropertyImplDecl *PID) {
                                            Types.ConvertType(PD->getType())));
     EmitReturnOfRValue(RV, PD->getType());
   } else {
-    EmitReturnOfRValue(EmitLoadOfLValue(EmitLValueForIvar(LoadObjCSelf(), 
-                                                          Ivar, 0), 
-                                        Ivar->getType()), 
-                       PD->getType());
+    LValue LV = EmitLValueForIvar(LoadObjCSelf(), Ivar, 0);
+    if (hasAggregateLLVMType(Ivar->getType())) {
+      EmitAggregateCopy(ReturnValue, LV.getAddress(), Ivar->getType());
+    }
+    else
+      EmitReturnOfRValue(EmitLoadOfLValue(LV, Ivar->getType()), 
+                                          PD->getType());
   }
 
   FinishFunction();
diff --git a/test/CodeGenObjC/property-aggr-type.m b/test/CodeGenObjC/property-aggr-type.m
new file mode 100644 (file)
index 0000000..dd2ef1f
--- /dev/null
@@ -0,0 +1,50 @@
+// RUN: clang -emit-llvm -o %t %s
+
+@interface Object
+- (id) new;
+@end
+
+typedef struct {int x, y, w, h;} st1;
+typedef struct {int x, y, w, h;} st2;
+
+@interface bar : Object
+- (void)setFrame:(st1)frameRect;
+@end
+
+@interface bar1 : Object
+- (void)setFrame:(int)frameRect;
+@end
+
+@interface foo : Object
+{
+       st2 ivar;
+}
+@property (assign) st2 frame;
+@end
+
+@implementation foo
+@synthesize frame = ivar;
+@end
+
+extern void abort();
+
+static   st2 r = {1,2,3,4};
+st2 test (void)
+{
+    foo *obj = [foo new];
+    id objid = [foo new];;
+
+    obj.frame = r;
+
+    ((foo*)objid).frame = obj.frame;
+
+    return ((foo*)objid).frame;
+}
+
+int main ()
+{
+  st2 res = test ();
+  if (res.x != 1 || res.h != 4)
+    abort();
+  return 0;
+}