blob: bc3bb475f5f78cb4842b5d04196e4f15bfbb1260 [file] [log] [blame]
John McCalld1e40d52011-10-02 01:16:38 +00001// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fobjc-fragile-abi -emit-llvm -o - | FileCheck %s
Fariborz Jahanian68af13f2011-03-30 16:11:20 +00002// rdar://9208606
3
John McCall6c11f0b2011-09-13 06:00:03 +00004struct MyStruct {
5 int x;
6 int y;
7 int z;
Fariborz Jahanian68af13f2011-03-30 16:11:20 +00008};
9
John McCall6c11f0b2011-09-13 06:00:03 +000010@interface MyClass {
11 MyStruct _foo;
Fariborz Jahanian68af13f2011-03-30 16:11:20 +000012}
13
14@property (assign, readwrite) const MyStruct& foo;
15
16- (const MyStruct&) foo;
17- (void) setFoo:(const MyStruct&)inFoo;
18@end
19
John McCall6c11f0b2011-09-13 06:00:03 +000020void test0() {
21 MyClass* myClass;
22 MyStruct myStruct;
Fariborz Jahanian68af13f2011-03-30 16:11:20 +000023
John McCall6c11f0b2011-09-13 06:00:03 +000024 myClass.foo = myStruct;
Fariborz Jahanian68af13f2011-03-30 16:11:20 +000025
John McCall6c11f0b2011-09-13 06:00:03 +000026 const MyStruct& currentMyStruct = myClass.foo;
Fariborz Jahanian68af13f2011-03-30 16:11:20 +000027}
28
29// CHECK: [[C:%.*]] = call %struct.MyStruct* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend
30// CHECK: store %struct.MyStruct* [[C]], %struct.MyStruct** [[D:%.*]]
John McCall6c11f0b2011-09-13 06:00:03 +000031
32namespace test1 {
33 struct A { A(); A(const A&); A&operator=(const A&); ~A(); };
34}
35@interface Test1 {
36 test1::A ivar;
37}
38@property const test1::A &prop1;
39@end
40@implementation Test1
41@synthesize prop1 = ivar;
42@end
43// CHECK: define internal [[A:%.*]]* @"\01-[Test1 prop1]"(
44// CHECK: [[SELF:%.*]] = alloca [[TEST1:%.*]]*, align 8
45// CHECK: [[T0:%.*]] = load [[TEST1]]** [[SELF]]
46// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST1]]* [[T0]] to i8*
47// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8* [[T1]], i64 0
48// CHECK-NEXT: [[T3:%.*]] = bitcast i8* [[T2]] to [[A]]*
49// CHECK-NEXT: ret [[A]]* [[T3]]
50
51// CHECK: define internal void @"\01-[Test1 setProp1:]"(
52// CHECK: call [[A]]* @_ZN5test11AaSERKS0_(
53// CHECK-NEXT: ret void
54