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