1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-MRC 2 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-ARC 3 4 __attribute__((objc_root_class)) 5 @interface Root 6 - (instancetype) init; 7 @end 8 9 @interface Base : Root 10 @end 11 12 @interface Middle : Base 13 + (void) abort __attribute__((noreturn)); 14 - (void) fail __attribute__((noreturn)); 15 @end 16 17 @interface Derived : Middle 18 @end 19 20 // An arbitrary instance pointer may be null. 21 void testInstanceMethod(Derived *x) { 22 [x fail]; 23 } 24 // CHECK-LABEL: @testInstanceMethod 25 // CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}){{$}} 26 27 // A direct call of a class method will normally never have a null receiver. 28 void testClassMethod() { 29 [Derived abort]; 30 } 31 // CHECK-LABEL: @testClassMethod 32 // CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}) [[NORETURN:#[0-9]+]] 33 34 __attribute__((weak_import)) 35 @interface WeakMiddle : Base 36 @end 37 38 @interface WeakDerived : WeakMiddle 39 + (void) abort __attribute__((noreturn)); 40 @end 41 42 // The class pointer of a weakly-imported class may be null. 43 void testWeakImport() { 44 [WeakDerived abort]; 45 } 46 // CHECK-LABEL: @testWeakImport 47 // CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}){{$}} 48 49 @interface Derived (MyMethods) 50 @end 51 52 @implementation Derived (MyMethods) 53 54 // In general, self can be reassigned, so we can't make stronger assumptions. 55 // But ARC makes self const in an ordinary method. 56 // TODO: do the analysis to take advantage of the dominant case where 57 // self is not reassigned. 58 - (void) testSelfInstanceMethod { 59 [self fail]; 60 } 61 // CHECK-LABEL: [Derived(MyMethods) testSelfInstanceMethod] 62 // CHECK-MRC: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}){{$}} 63 // CHECK-ARC: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}) [[NORETURN]] 64 65 // The ARC rule doesn't apply in -init methods. 66 - (id) initWhileTestingSelfInstanceMethod { 67 self = [super init]; 68 [self fail]; 69 return self; 70 } 71 // CHECK-LABEL: [Derived(MyMethods) initWhileTestingSelfInstanceMethod] 72 // CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}){{$}} 73 74 // Same thing applies to class methods. 75 + (void) testSelfClassMethod { 76 [self abort]; 77 } 78 // CHECK-LABEL: [Derived(MyMethods) testSelfClassMethod] 79 // CHECK-MRC: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}){{$}} 80 // CHECK-ARC: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* {{.*}}, i8* {{.*}}) [[NORETURN]] 81 82 // Super invocations may never be used with a null pointer; this is a 83 // constraint on user code when it isn't enforced by the ARC const-self 84 // rule. 85 - (void) testSuperInstanceMethod { 86 [super fail]; 87 } 88 // CHECK-LABEL: [Derived(MyMethods) testSuperInstanceMethod] 89 // CHECK: call void bitcast (i8* ([[SUPER_T:%.*]]*, i8*, ...)* @objc_msgSendSuper2 to void ([[SUPER_T]]*, i8*)*)([[SUPER_T]]* {{.*}}, i8* {{.*}}) [[NORETURN]] 90 91 + (void) testSuperClassMethod { 92 [super abort]; 93 } 94 // CHECK-LABEL: [Derived(MyMethods) testSuperClassMethod] 95 // CHECK: call void bitcast (i8* ([[SUPER_T]]*, i8*, ...)* @objc_msgSendSuper2 to void ([[SUPER_T]]*, i8*)*)([[SUPER_T]]* {{.*}}, i8* {{.*}}) [[NORETURN]] 96 @end 97 98 // CHECK: attributes [[NORETURN]] = { noreturn } 99