Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / SemaObjCXX / conversion-ranking.mm
blobb34c9a24ed5a448e7368fe8c1a57e52db49d8413
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // expected-no-diagnostics
3 @protocol P1
4 @end
6 @interface A <P1>
7 @end
9 @interface B : A
10 @end
12 @interface C : B
13 @end
15 template<typename T>
16 struct ConvertsTo {
17   operator T() const;
21 // conversion of C* to B* is better than conversion of C* to A*.
22 int &f0(A*);
23 float &f0(B*);
25 void test_f0(C *c) {
26   float &fr1 = f0(c);
29 // conversion of B* to A* is better than conversion of C* to A*
30 void f1(A*);
32 struct ConvertsToBoth {
33 private:
34   operator C*() const;
36 public:
37   operator B*() const;
40 void test_f1(ConvertsTo<B*> toB, ConvertsTo<C*> toC, ConvertsToBoth toBoth) {
41   f1(toB);
42   f1(toC);
43   f1(toBoth);
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);
51 void test_f2(B *b) {
52   int &ir = f2(b);
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);
60 void test_f3(B *b) {
61   int &ir = f3(b);
64 // When both conversions convert to 'id' or 'Class', pick the most
65 // specific type to convert from.
66 void f4(id);
68 void test_f4(ConvertsTo<B*> toB, ConvertsTo<C*> toC, ConvertsToBoth toBoth) {
69   f4(toB);
70   f4(toC);
71   f4(toBoth);
74 void f5(id<P1>);
76 void test_f5(ConvertsTo<B*> toB, ConvertsTo<C*> toC, ConvertsToBoth toBoth) {
77   f5(toB);
78   f5(toC);
79   f5(toBoth);
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>);
88 void test_f6(B *b) {
89   int &ir = f6(b);