1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | namespace test0 { |
4 | struct BASE { |
5 | operator int &(); // expected-note {{candidate function}} |
6 | }; |
7 | struct BASE1 { |
8 | operator int &(); // expected-note {{candidate function}} |
9 | }; |
10 | |
11 | struct B : public BASE, BASE1 {}; |
12 | |
13 | extern B f(); |
14 | B b1; |
15 | |
16 | void func(const int ci, const char cc); // expected-note {{candidate function}} |
17 | void func(const char ci, const B b); // expected-note {{candidate function}} |
18 | void func(const B b, const int ci); // expected-note {{candidate function}} |
19 | |
20 | const int Test1() { |
21 | |
22 | func(b1, f()); // expected-error {{call to 'func' is ambiguous}} |
23 | return f(); // expected-error {{conversion from 'test0::B' to 'const int' is ambiguous}} |
24 | } |
25 | |
26 | // This used to crash when comparing the two operands. |
27 | void func2(const char cc); // expected-note {{candidate function}} |
28 | void func2(const int ci); // expected-note {{candidate function}} |
29 | void Test2() { |
30 | func2(b1); // expected-error {{call to 'func2' is ambiguous}} |
31 | } |
32 | } |
33 | |
34 | namespace test1 { |
35 | struct E; |
36 | struct A { |
37 | A (E&); |
38 | }; |
39 | |
40 | struct E { |
41 | operator A (); |
42 | }; |
43 | |
44 | struct C { |
45 | C (E&); |
46 | }; |
47 | |
48 | void f1(A); // expected-note {{candidate function}} |
49 | void f1(C); // expected-note {{candidate function}} |
50 | |
51 | void Test2() |
52 | { |
53 | E b; |
54 | f1(b); // expected-error {{call to 'f1' is ambiguous}} |
55 | // ambiguous because b -> C via constructor and |
56 | // b -> A via constructor or conversion function. |
57 | } |
58 | } |
59 | |
60 | namespace rdar8876150 { |
61 | struct A { operator bool(); }; |
62 | struct B : A { }; |
63 | struct C : A { }; |
64 | struct D : B, C { }; |
65 | |
66 | bool f(D d) { return !d; } // expected-error{{ambiguous conversion from derived class 'rdar8876150::D' to base class 'rdar8876150::A':}} |
67 | } |
68 | |
69 | namespace assignment { |
70 | struct A { operator short(); operator bool(); }; // expected-note 2{{candidate}} |
71 | void f(int n, A a) { n = a; } // expected-error{{ambiguous}} |
72 | } |
73 | |