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 11 id<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 30 id<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 38 id<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 44 id<MyProto1, MyProto2> Gunc4(id <MyProto2, MyProto1>p2) 45 { 46 return p2; 47 } 48 49 50 51 INTF<MyProto1> * Hunc(id <MyProto1, MyProto2>p2) 52 { 53 return p2; 54 } 55 56 57 INTF<MyProto1> * Hunc1(id <MyProto1, MyProto2>p2) 58 { 59 return p2; 60 } 61 62 INTF<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 68 INTF<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 74 INTF<MyProto1, MyProto2> * Hunc4(id <MyProto2, MyProto1>p2) 75 { 76 return p2; 77 } 78 79 id Iunc(id <MyProto1, MyProto2>p2) 80 { 81 return p2; 82 } 83 84 85 id<MyProto1> Iunc1(id p2) 86 { 87 return p2; 88 } 89 90 id<MyProto1, MyProto2> Iunc2(id p2) 91 { 92 Iunc(p2); 93 return p2; 94 } 95