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