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