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