150
|
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
2 // expected-no-diagnostics
|
|
3 @protocol P1
|
|
4 @end
|
|
5
|
|
6 @interface A <P1>
|
|
7 @end
|
|
8
|
|
9 @interface B : A
|
|
10 @end
|
|
11
|
|
12 @interface C : B
|
|
13 @end
|
|
14
|
|
15 template<typename T>
|
|
16 struct ConvertsTo {
|
|
17 operator T() const;
|
|
18 };
|
|
19
|
|
20
|
|
21 // conversion of C* to B* is better than conversion of C* to A*.
|
|
22 int &f0(A*);
|
|
23 float &f0(B*);
|
|
24
|
|
25 void test_f0(C *c) {
|
|
26 float &fr1 = f0(c);
|
|
27 }
|
|
28
|
|
29 // conversion of B* to A* is better than conversion of C* to A*
|
|
30 void f1(A*);
|
|
31
|
|
32 struct ConvertsToBoth {
|
|
33 private:
|
|
34 operator C*() const;
|
|
35
|
|
36 public:
|
|
37 operator B*() const;
|
|
38 };
|
|
39
|
|
40 void test_f1(ConvertsTo<B*> toB, ConvertsTo<C*> toC, ConvertsToBoth toBoth) {
|
|
41 f1(toB);
|
|
42 f1(toC);
|
|
43 f1(toBoth);
|
|
44 };
|
|
45
|
|
46 // A conversion to an a non-id object pointer type is better than a
|
|
47 // conversion to 'id'.
|
|
48 int &f2(A*);
|
|
49 float &f2(id);
|
|
50
|
|
51 void test_f2(B *b) {
|
|
52 int &ir = f2(b);
|
|
53 }
|
|
54
|
|
55 // A conversion to an a non-Class object pointer type is better than a
|
|
56 // conversion to 'Class'.
|
|
57 int &f3(A*);
|
|
58 float &f3(Class);
|
|
59
|
|
60 void test_f3(B *b) {
|
|
61 int &ir = f3(b);
|
|
62 }
|
|
63
|
|
64 // When both conversions convert to 'id' or 'Class', pick the most
|
|
65 // specific type to convert from.
|
|
66 void f4(id);
|
|
67
|
|
68 void test_f4(ConvertsTo<B*> toB, ConvertsTo<C*> toC, ConvertsToBoth toBoth) {
|
|
69 f4(toB);
|
|
70 f4(toC);
|
|
71 f4(toBoth);
|
|
72 }
|
|
73
|
|
74 void f5(id<P1>);
|
|
75
|
|
76 void test_f5(ConvertsTo<B*> toB, ConvertsTo<C*> toC, ConvertsToBoth toBoth) {
|
|
77 f5(toB);
|
|
78 f5(toC);
|
|
79 f5(toBoth);
|
|
80 }
|
|
81
|
|
82
|
|
83 // A conversion to an a non-id object pointer type is better than a
|
|
84 // conversion to qualified 'id'.
|
|
85 int &f6(A*);
|
|
86 float &f6(id<P1>);
|
|
87
|
|
88 void test_f6(B *b) {
|
|
89 int &ir = f6(b);
|
|
90 }
|