1// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
2
3@interface NSObject
4+ (id)alloc;
5- (id)init;
6- (id)retain;
7@end
8
9@interface NSString : NSObject
10@end
11
12// CHECK-LABEL: define {{.*}}void @test1()
13void test1() {
14  // CHECK: {{call.*@objc_msgSend}}
15  // CHECK: {{call.*@objc_msgSend}}
16  // CHECK: {{call.*@objc_msgSend}}
17  // CHECK: bitcast i8*
18  NSString *str1 = [[[NSString alloc] init] retain];
19}
20
21// CHECK-LABEL: define {{.*}}void @test2()
22void test2() {
23  // CHECK: {{call.*@objc_msgSend}}
24  // CHECK: {{call.*@objc_msgSend}}
25  // CHECK: {{call.*@objc_msgSend}}
26  // CHECK: bitcast i8*
27  NSString *str1 = NSString.alloc.init.retain;
28}
29
30@interface Test2 : NSString
31- (id)init;
32@end
33
34@implementation Test2
35// CHECK: define internal {{.*}}i8* @"\01-[Test2 init]"
36- (id)init {
37  // CHECK: {{call.*@objc_msgSendSuper}}
38  // CHECK-NEXT: bitcast i8*
39  return [super init];
40}
41@end
42
43@interface Test3 : NSString
44- (id)init;
45@end
46
47@implementation Test3
48// CHECK: define internal {{.*}}i8* @"\01-[Test3 init]"
49- (id)init {
50  // CHECK: {{call.*@objc_msgSendSuper}}
51  // CHECK-NEXT: bitcast i8*
52  return [super init];
53}
54@end
55