xref: /aosp_15_r20/external/clang/test/CodeGenObjC/messages-2.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-NF
3*67e74705SXin Li
4*67e74705SXin Li// Most of this test is apparently just verifying that we don't crash.
5*67e74705SXin Li
6*67e74705SXin Liint printf(const char *, ...);
7*67e74705SXin Li
8*67e74705SXin Li@interface Root
9*67e74705SXin Li@end
10*67e74705SXin Li
11*67e74705SXin Litypedef struct {
12*67e74705SXin Li  int x, y, z[10];
13*67e74705SXin Li} MyPoint;
14*67e74705SXin Litypedef struct {
15*67e74705SXin Li  float width, height;
16*67e74705SXin Li} MySize;
17*67e74705SXin Li
18*67e74705SXin Li@interface A : Root
19*67e74705SXin Li+(void) printThisInt: (int) arg0 andThatFloat: (float) arg1 andADouble: (double) arg2 andAPoint: (MyPoint) arg3;
20*67e74705SXin Li+(float) returnAFloat;
21*67e74705SXin Li+(double) returnADouble;
22*67e74705SXin Li+(MyPoint) returnAPoint;
23*67e74705SXin Li+(void) printThisSize: (MySize) arg0;
24*67e74705SXin Li+(MySize) returnASize;
25*67e74705SXin Li
26*67e74705SXin Li-(void) printThisInt: (int) arg0 andThatFloat: (float) arg1 andADouble: (double) arg2 andAPoint: (MyPoint) arg3;
27*67e74705SXin Li-(float) returnAFloat;
28*67e74705SXin Li-(double) returnADouble;
29*67e74705SXin Li-(MyPoint) returnAPoint;
30*67e74705SXin Li-(void) printThisSize: (MySize) arg0;
31*67e74705SXin Li-(MySize) returnASize;
32*67e74705SXin Li@end
33*67e74705SXin Li@interface B : A
34*67e74705SXin Li@end
35*67e74705SXin Li
36*67e74705SXin Li@implementation A
37*67e74705SXin Li+(void) printThisInt: (int) arg0 andThatFloat: (float) arg1 andADouble: (double) arg2 andAPoint: (MyPoint) arg3 {
38*67e74705SXin Li  printf("(CLASS) theInt: %d, theFloat: %f, theDouble: %f, thePoint: { %d, %d }\n",
39*67e74705SXin Li         arg0, arg1, arg2, arg3.x, arg3.y);
40*67e74705SXin Li}
41*67e74705SXin Li+(float) returnAFloat {
42*67e74705SXin Li  return 15.;
43*67e74705SXin Li}
44*67e74705SXin Li+(double) returnADouble {
45*67e74705SXin Li  return 25.;
46*67e74705SXin Li}
47*67e74705SXin Li+(MyPoint) returnAPoint {
48*67e74705SXin Li  MyPoint x = { 35, 45 };
49*67e74705SXin Li  return x;
50*67e74705SXin Li}
51*67e74705SXin Li+(void) printThisSize: (MySize) arg0 {
52*67e74705SXin Li  printf("(CLASS) theSize: { %f, %f }\n",
53*67e74705SXin Li         arg0.width, arg0.height);
54*67e74705SXin Li}
55*67e74705SXin Li+(MySize) returnASize {
56*67e74705SXin Li  MySize x = { 32, 44 };
57*67e74705SXin Li  return x;
58*67e74705SXin Li}
59*67e74705SXin Li
60*67e74705SXin Li-(void) printThisInt: (int) arg0 andThatFloat: (float) arg1 andADouble: (double) arg2 andAPoint: (MyPoint) arg3 {
61*67e74705SXin Li  printf("theInt: %d, theFloat: %f, theDouble: %f, thePoint: { %d, %d }\n",
62*67e74705SXin Li         arg0, arg1, arg2, arg3.x, arg3.y);
63*67e74705SXin Li}
64*67e74705SXin Li-(float) returnAFloat {
65*67e74705SXin Li  return 10.;
66*67e74705SXin Li}
67*67e74705SXin Li-(double) returnADouble {
68*67e74705SXin Li  return 20.;
69*67e74705SXin Li}
70*67e74705SXin Li-(MyPoint) returnAPoint {
71*67e74705SXin Li  MyPoint x = { 30, 40 };
72*67e74705SXin Li  return x;
73*67e74705SXin Li}
74*67e74705SXin Li-(void) printThisSize: (MySize) arg0 {
75*67e74705SXin Li  printf("theSize: { %f, %f }\n",
76*67e74705SXin Li         arg0.width, arg0.height);
77*67e74705SXin Li}
78*67e74705SXin Li-(MySize) returnASize {
79*67e74705SXin Li  MySize x = { 22, 34 };
80*67e74705SXin Li  return x;
81*67e74705SXin Li}
82*67e74705SXin Li@end
83*67e74705SXin Li
84*67e74705SXin Li@implementation B
85*67e74705SXin Li+(void) printThisInt: (int) arg0 andThatFloat: (float) arg1 andADouble: (double) arg2 andAPoint: (MyPoint) arg3 {
86*67e74705SXin Li  arg3.x *= 2;
87*67e74705SXin Li  arg3.y *= 2;
88*67e74705SXin Li  [ super printThisInt: arg0*2 andThatFloat: arg1*2 andADouble: arg2*2 andAPoint: arg3 ];
89*67e74705SXin Li}
90*67e74705SXin Li+(void) printThisSize: (MySize) arg0 {
91*67e74705SXin Li  arg0.width *= 2;
92*67e74705SXin Li  arg0.height *= 2;
93*67e74705SXin Li  [ super printThisSize: arg0 ];
94*67e74705SXin Li}
95*67e74705SXin Li+(float) returnAFloat {
96*67e74705SXin Li  return [ super returnAFloat ]*2;
97*67e74705SXin Li}
98*67e74705SXin Li+(double) returnADouble {
99*67e74705SXin Li  return [ super returnADouble ]*2;
100*67e74705SXin Li}
101*67e74705SXin Li+(MyPoint) returnAPoint {
102*67e74705SXin Li  MyPoint x = [ super returnAPoint ];
103*67e74705SXin Li  x.x *= 2;
104*67e74705SXin Li  x.y *= 2;
105*67e74705SXin Li  return x;
106*67e74705SXin Li}
107*67e74705SXin Li+(MySize) returnASize {
108*67e74705SXin Li  MySize x = [ super returnASize ];
109*67e74705SXin Li  x.width *= 2;
110*67e74705SXin Li  x.height *= 2;
111*67e74705SXin Li  return x;
112*67e74705SXin Li}
113*67e74705SXin Li
114*67e74705SXin Li-(void) printThisInt: (int) arg0 andThatFloat: (float) arg1 andADouble: (double) arg2 andAPoint: (MyPoint) arg3 {
115*67e74705SXin Li  arg3.x *= 2;
116*67e74705SXin Li  arg3.y *= 2;
117*67e74705SXin Li  [ super printThisInt: arg0*2 andThatFloat: arg1*2 andADouble: arg2*2 andAPoint: arg3 ];
118*67e74705SXin Li}
119*67e74705SXin Li-(void) printThisSize: (MySize) arg0 {
120*67e74705SXin Li  arg0.width *= 2;
121*67e74705SXin Li  arg0.height *= 2;
122*67e74705SXin Li  [ super printThisSize: arg0 ];
123*67e74705SXin Li}
124*67e74705SXin Li-(float) returnAFloat {
125*67e74705SXin Li  return [ super returnAFloat ]*2;
126*67e74705SXin Li}
127*67e74705SXin Li-(double) returnADouble {
128*67e74705SXin Li  return [ super returnADouble ]*2;
129*67e74705SXin Li}
130*67e74705SXin Li-(MyPoint) returnAPoint {
131*67e74705SXin Li  MyPoint x = [ super returnAPoint ];
132*67e74705SXin Li  x.x *= 2;
133*67e74705SXin Li  x.y *= 2;
134*67e74705SXin Li  return x;
135*67e74705SXin Li}
136*67e74705SXin Li-(MySize) returnASize {
137*67e74705SXin Li  MySize x = [ super returnASize ];
138*67e74705SXin Li  x.width *= 2;
139*67e74705SXin Li  x.height *= 2;
140*67e74705SXin Li  return x;
141*67e74705SXin Li}
142*67e74705SXin Li-(const float) returnAConstFloat {
143*67e74705SXin Li  return 5;
144*67e74705SXin Li}
145*67e74705SXin Li@end
146*67e74705SXin Li
147*67e74705SXin Li// rdar://problem/7854674
148*67e74705SXin Li// CHECK:    define void @test0([[A:%.*]]*
149*67e74705SXin Li// CHECK-NF: define void @test0([[A:%.*]]*
150*67e74705SXin Livoid test0(A *x) {
151*67e74705SXin Li  // CHECK:         [[X:%.*]] = alloca [[A]]*
152*67e74705SXin Li  // CHECK-NEXT:    [[POINT:%.*]] = alloca [[POINT_T:%.*]],
153*67e74705SXin Li  // CHECK:         [[T0:%.*]] = load [[A]]*, [[A]]** [[X]]
154*67e74705SXin Li  // CHECK:         [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8*
155*67e74705SXin Li  // CHECK-NEXT:    icmp eq i8* [[T1]], null
156*67e74705SXin Li  // CHECK-NEXT:    br i1
157*67e74705SXin Li  // CHECK:         call {{.*}} @objc_msgSend_stret to
158*67e74705SXin Li  // CHECK-NEXT:    br label
159*67e74705SXin Li  // CHECK:         [[T0:%.*]] = bitcast [[POINT_T]]* [[POINT]] to i8*
160*67e74705SXin Li  // CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* [[T0]], i8 0, i64 48, i32 4, i1 false)
161*67e74705SXin Li  // CHECK-NEXT:    br label
162*67e74705SXin Li
163*67e74705SXin Li  // CHECK-NF:      [[X:%.*]] = alloca [[A]]*
164*67e74705SXin Li  // CHECK-NF-NEXT: [[POINT:%.*]] = alloca [[POINT_T:%.*]],
165*67e74705SXin Li  // CHECK-NF:      [[T0:%.*]] = load [[A]]*, [[A]]** [[X]]
166*67e74705SXin Li  // CHECK-NF:      [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8*
167*67e74705SXin Li  // CHECK-NF-NEXT: icmp eq i8* [[T1]], null
168*67e74705SXin Li  // CHECK-NF-NEXT: br i1
169*67e74705SXin Li  // CHECK-NF:      call {{.*}} @objc_msgSend_stret to
170*67e74705SXin Li  // CHECK-NF-NEXT: br label
171*67e74705SXin Li  // CHECK-NF:      [[T0:%.*]] = bitcast [[POINT_T]]* [[POINT]] to i8*
172*67e74705SXin Li  // CHECK-NF-NEXT: call void @llvm.memset.p0i8.i64(i8* [[T0]], i8 0, i64 48, i32 4, i1 false)
173*67e74705SXin Li  // CHECK-NF-NEXT: br label
174*67e74705SXin Li  MyPoint point = [x returnAPoint];
175*67e74705SXin Li}
176