]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaObjCXX/conversion-ranking.mm
Vendor import of clang trunk r300422:
[FreeBSD/FreeBSD.git] / test / SemaObjCXX / conversion-ranking.mm
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 }