xref: /aosp_15_r20/external/clang/test/CodeGenObjCXX/property-lvalue-capture.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li// rdar://15118128
3*67e74705SXin Li
4*67e74705SXin Litemplate <typename T> struct Quad2 {
5*67e74705SXin Li  Quad2() {}
6*67e74705SXin Li};
7*67e74705SXin Li
8*67e74705SXin Litypedef Quad2<double> Quad2d;
9*67e74705SXin Li
10*67e74705SXin Li@interface Root @end
11*67e74705SXin Li
12*67e74705SXin Li@interface PAGeometryFrame
13*67e74705SXin Li- (const Quad2d &)quad;
14*67e74705SXin Li- (void)setQuad:(const Quad2d &)quad;
15*67e74705SXin Li@end
16*67e74705SXin Li
17*67e74705SXin Li@interface PA2DScaleTransform  : Root
18*67e74705SXin Li@end
19*67e74705SXin Li
20*67e74705SXin Li@implementation PA2DScaleTransform
21*67e74705SXin Li- (void)transformFrame:(PAGeometryFrame *)frame {
22*67e74705SXin Li PAGeometryFrame *result;
23*67e74705SXin Li result.quad  = frame.quad;
24*67e74705SXin Li}
25*67e74705SXin Li@end
26*67e74705SXin Li
27*67e74705SXin Li// CHECK:   [[TWO:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_, align 8, !invariant.load ![[MD_NUM:[0-9]+]]
28*67e74705SXin Li// CHECK:   [[THREE:%.*]] = bitcast [[ONET:%.*]]* [[ONE:%.*]] to i8*
29*67e74705SXin Li// CHECK:   [[CALL:%.*]] = call nonnull %struct.Quad2* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %struct.Quad2* (i8*, i8*)*)(i8* [[THREE]], i8* [[TWO]])
30*67e74705SXin Li// CHECK:   [[FOUR:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.2, align 8, !invariant.load ![[MD_NUM]]
31*67e74705SXin Li// CHECK:   [[FIVE:%.*]] = bitcast [[ONET]]* [[ZERO:%.*]] to i8*
32*67e74705SXin Li// CHECK:   call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %struct.Quad2*)*)(i8* [[FIVE]], i8* [[FOUR]], %struct.Quad2* nonnull [[CALL]])
33*67e74705SXin Li
34*67e74705SXin Li
35*67e74705SXin Listruct A {
36*67e74705SXin Li void *ptr;
37*67e74705SXin Li A();
38*67e74705SXin Li A(const A &);
39*67e74705SXin Li ~A();
40*67e74705SXin Li};
41*67e74705SXin Li
42*67e74705SXin Li@interface C
43*67e74705SXin Li- (void) setProp: (const A&) value;
44*67e74705SXin Li@end
45*67e74705SXin Livoid test(C *c, const A &a) {
46*67e74705SXin Li const A &result = c.prop = a;
47*67e74705SXin Li}
48*67e74705SXin Li
49*67e74705SXin Li// CHECK:   [[ONE1:%.*]] = load %struct.A*, %struct.A** [[AADDR:%.*]], align 8
50*67e74705SXin Li// CHECK:   [[TWO1:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.5, align 8, !invariant.load ![[MD_NUM]]
51*67e74705SXin Li// CHECK:   [[THREE1:%.*]] = bitcast [[TWOT:%.*]]* [[ZERO1:%.*]] to i8*
52*67e74705SXin Li// CHECK:   call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %struct.A*)*)(i8* [[THREE1]], i8* [[TWO1]], %struct.A* dereferenceable({{[0-9]+}}) [[ONE1]])
53*67e74705SXin Li// CHECK:   store %struct.A* [[ONE1]], %struct.A** [[RESULT:%.*]], align 8
54