1// RUN: %clang_cc1 -pedantic -fsyntax-only -verify %s 2 3@protocol MyProto1 4@end 5 6@protocol MyProto2 7@end 8 9@interface INTF @end 10 11id<MyProto1> Func(INTF <MyProto1, MyProto2> *p2) // expected-note 2{{passing argument to parameter 'p2' here}} 12{ 13 return p2; 14} 15 16 17 18 19 id<MyProto1> Gunc(id <MyProto1, MyProto2>p2) 20{ 21 return p2; 22} 23 24 25 id<MyProto1> Gunc1(id <MyProto1, MyProto2>p2) 26{ 27 return p2; 28} 29 30id<MyProto1, MyProto2> Gunc2(id <MyProto1>p2) 31{ 32 Func(p2); // expected-warning {{passing 'id<MyProto1>' to parameter of incompatible type 'INTF<MyProto1,MyProto2> *'}} 33 return p2; // expected-warning {{returning 'id<MyProto1>' from a function with incompatible result type 'id<MyProto1,MyProto2>'}} 34} 35 36 37 38id<MyProto1> Gunc3(id <MyProto2>p2) 39{ 40 return p2; // expected-warning {{returning 'id<MyProto2>' from a function with incompatible result type 'id<MyProto1>'}} 41} 42 43 44id<MyProto1, MyProto2> Gunc4(id <MyProto2, MyProto1>p2) 45{ 46 return p2; 47} 48 49 50 51INTF<MyProto1> * Hunc(id <MyProto1, MyProto2>p2) 52{ 53 return p2; 54} 55 56 57INTF<MyProto1> * Hunc1(id <MyProto1, MyProto2>p2) 58{ 59 return p2; 60} 61 62INTF<MyProto1, MyProto2> * Hunc2(id <MyProto1>p2) 63{ 64 Func(p2); // expected-warning {{passing 'id<MyProto1>' to parameter of incompatible type 'INTF<MyProto1,MyProto2> *'}} 65 return p2; // expected-warning {{returning 'id<MyProto1>' from a function with incompatible result type 'INTF<MyProto1,MyProto2> *'}} 66} 67 68INTF<MyProto1> * Hunc3(id <MyProto2>p2) 69{ 70 return p2; // expected-warning {{returning 'id<MyProto2>' from a function with incompatible result type 'INTF<MyProto1> *'}} 71} 72 73 74INTF<MyProto1, MyProto2> * Hunc4(id <MyProto2, MyProto1>p2) 75{ 76 return p2; 77} 78 79id Iunc(id <MyProto1, MyProto2>p2) 80{ 81 return p2; 82} 83 84 85id<MyProto1> Iunc1(id p2) 86{ 87 return p2; 88} 89 90id<MyProto1, MyProto2> Iunc2(id p2) 91{ 92 Iunc(p2); 93 return p2; 94} 95