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