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