1 | // RUN: %clang_cc1 -x objective-c -Wno-objc-root-class -fms-extensions -rewrite-objc %s -o %t-rw.cpp |
2 | // RUN: FileCheck --input-file=%t-rw.cpp %s |
3 | // rdar://9846759 |
4 | // rdar://15517895 |
5 | |
6 | typedef struct MyWidget { |
7 | int a; |
8 | } MyWidget; |
9 | |
10 | MyWidget gWidget = { 17 }; |
11 | |
12 | @protocol MyProto |
13 | - (MyWidget *)widget; |
14 | @end |
15 | |
16 | @interface Foo |
17 | @end |
18 | |
19 | @interface Bar: Foo <MyProto> |
20 | @end |
21 | |
22 | @interface Container |
23 | + (MyWidget *)elementForView:(Foo *)view; |
24 | @end |
25 | |
26 | @implementation Foo |
27 | @end |
28 | |
29 | @implementation Bar |
30 | - (MyWidget *)widget { |
31 | return &gWidget; |
32 | } |
33 | @end |
34 | |
35 | @implementation Container |
36 | + (MyWidget *)elementForView:(Foo *)view |
37 | { |
38 | MyWidget *widget = (void*)0; |
39 | if (@protocol(MyProto)) { |
40 | widget = [(id <MyProto>)view widget]; |
41 | } |
42 | return widget; |
43 | } |
44 | @end |
45 | |
46 | int main(void) { |
47 | id view; |
48 | MyWidget *w = [Container elementForView: view]; |
49 | |
50 | return 0; |
51 | } |
52 | |
53 | // rdar://15517895 |
54 | @class NSObject; |
55 | |
56 | @interface NSProtocolChecker |
57 | + (id)protocolCheckerWithTarget:(NSObject *)anObject protocol:(Protocol *)aProtocol; |
58 | @end |
59 | |
60 | @protocol NSConnectionVersionedProtocol |
61 | @end |
62 | |
63 | |
64 | @interface NSConnection @end |
65 | |
66 | @implementation NSConnection |
67 | - (void) Meth { |
68 | [NSProtocolChecker protocolCheckerWithTarget:0 protocol:@protocol(NSConnectionVersionedProtocol)]; |
69 | } |
70 | @end |
71 | |
72 | // CHECK: static struct _protocol_t *_OBJC_PROTOCOL_REFERENCE_$_NSConnectionVersionedProtocol = &_OBJC_PROTOCOL_NSConnectionVersionedProtocol |
73 | // CHECK: sel_registerName("protocolCheckerWithTarget:protocol:"), (NSObject *)0, (Protocol *)_OBJC_PROTOCOL_REFERENCE_$_NSConnectionVersionedProtocol |
74 | |