| // RUN: %clang_cc1 -x objective-c -Wno-objc-root-class -fms-extensions -rewrite-objc %s -o %t-rw.cpp |
| // RUN: FileCheck --input-file=%t-rw.cpp %s |
| // rdar://9846759 |
| // rdar://15517895 |
| |
| typedef struct MyWidget { |
| int a; |
| } MyWidget; |
| |
| MyWidget gWidget = { 17 }; |
| |
| @protocol MyProto |
| - (MyWidget *)widget; |
| @end |
| |
| @interface Foo |
| @end |
| |
| @interface Bar: Foo <MyProto> |
| @end |
| |
| @interface Container |
| + (MyWidget *)elementForView:(Foo *)view; |
| @end |
| |
| @implementation Foo |
| @end |
| |
| @implementation Bar |
| - (MyWidget *)widget { |
| return &gWidget; |
| } |
| @end |
| |
| @implementation Container |
| + (MyWidget *)elementForView:(Foo *)view |
| { |
| MyWidget *widget = (void*)0; |
| if (@protocol(MyProto)) { |
| widget = [(id <MyProto>)view widget]; |
| } |
| return widget; |
| } |
| @end |
| |
| int main(void) { |
| id view; |
| MyWidget *w = [Container elementForView: view]; |
| |
| return 0; |
| } |
| |
| // rdar://15517895 |
| @class NSObject; |
| |
| @interface NSProtocolChecker |
| + (id)protocolCheckerWithTarget:(NSObject *)anObject protocol:(Protocol *)aProtocol; |
| @end |
| |
| @protocol NSConnectionVersionedProtocol |
| @end |
| |
| |
| @interface NSConnection @end |
| |
| @implementation NSConnection |
| - (void) Meth { |
| [NSProtocolChecker protocolCheckerWithTarget:0 protocol:@protocol(NSConnectionVersionedProtocol)]; |
| } |
| @end |
| |
| // CHECK: static struct _protocol_t *_OBJC_PROTOCOL_REFERENCE_$_NSConnectionVersionedProtocol = &_OBJC_PROTOCOL_NSConnectionVersionedProtocol |
| // CHECK: sel_registerName("protocolCheckerWithTarget:protocol:"), (NSObject *)0, (Protocol *)_OBJC_PROTOCOL_REFERENCE_$_NSConnectionVersionedProtocol |