1/* { dg-do run } */ 2/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ 3#include "../objc-obj-c++-shared/TestsuiteObject.m" 4#include <stdlib.h> 5 6class MyWidget { 7 public: 8 int a; 9 MyWidget(void) { a = 17; } 10}; 11 12MyWidget gWidget; 13 14@protocol MyProto 15- (MyWidget *)widget; 16@end 17 18@interface Foo: TestsuiteObject 19@end 20 21@interface Bar: Foo <MyProto> 22@end 23 24@interface Container: TestsuiteObject 25+ (MyWidget *)elementForView:(Foo *)view; 26@end 27 28@implementation Foo 29@end 30 31@implementation Bar 32- (MyWidget *)widget { 33 return &gWidget; 34} 35@end 36 37@implementation Container 38+ (MyWidget *)elementForView:(Foo *)view 39{ 40 MyWidget *widget = 0; 41 if (class_conformsToProtocol (object_getClass (view), 42 @protocol(MyProto))) { 43 widget = [(Foo <MyProto> *)view widget]; 44 } 45 return widget; 46} 47@end 48 49int main(void) { 50 id view = [Bar new]; 51 MyWidget *w = [Container elementForView: view]; 52 53 if (!w || w->a != 17) 54 abort (); 55 56 return 0; 57} 58 59