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