blob: 413e4d1933676ae7ad7e32da3b9282ddcdf8e54f [file] [log] [blame]
Sebastian Redl8593c782009-05-21 11:50:50 +00001// RUN: clang-cc -fsyntax-only -verify %s
2struct A {
3};
4
5struct ConvertibleToA {
6 operator A();
7};
8
9struct ConvertibleToConstA {
10 operator const A();
11};
12
13struct B {
Douglas Gregor33074752009-09-30 21:46:01 +000014 B& operator=(B&); // expected-note 4 {{candidate function}}
Sebastian Redl8593c782009-05-21 11:50:50 +000015};
16
17struct ConvertibleToB {
18 operator B();
19};
20
21struct ConvertibleToBref {
22 operator B&();
23};
24
25struct ConvertibleToConstB {
26 operator const B();
27};
28
29struct ConvertibleToConstBref {
30 operator const B&();
31};
32
33struct C {
34 int operator=(int); // expected-note{{candidate function}}
35 long operator=(long); // expected-note{{candidate function}}
36 int operator+=(int); // expected-note{{candidate function}}
37 int operator+=(long); // expected-note{{candidate function}}
38};
39
40struct D {
41 D& operator+=(const D &);
42};
43
44struct ConvertibleToInt {
45 operator int();
46};
47
48void test() {
49 A a, na;
50 const A constA;
51 ConvertibleToA convertibleToA;
52 ConvertibleToConstA convertibleToConstA;
53
54 B b, nb;
55 const B constB;
56 ConvertibleToB convertibleToB;
57 ConvertibleToBref convertibleToBref;
58 ConvertibleToConstB convertibleToConstB;
59 ConvertibleToConstBref convertibleToConstBref;
60
61 C c, nc;
62 const C constC;
63
64 D d, nd;
65 const D constD;
66
67 ConvertibleToInt convertibleToInt;
68
69 na = a;
70 na = constA;
71 na = convertibleToA;
72 na = convertibleToConstA;
73 na += a; // expected-error{{no viable overloaded '+='}}
74
75 nb = b;
76 nb = constB; // expected-error{{no viable overloaded '='}}
77 nb = convertibleToB; // expected-error{{no viable overloaded '='}}
78 nb = convertibleToBref;
79 nb = convertibleToConstB; // expected-error{{no viable overloaded '='}}
80 nb = convertibleToConstBref; // expected-error{{no viable overloaded '='}}
81
82 nc = c;
83 nc = constC;
84 nc = 1;
85 nc = 1L;
86 nc = 1.0; // expected-error{{use of overloaded operator '=' is ambiguous}}
87 nc += 1;
88 nc += 1L;
89 nc += 1.0; // expected-error{{use of overloaded operator '+=' is ambiguous}}
90
91 nd = d;
92 nd += d;
93 nd += constD;
94
95 int i;
96 i = convertibleToInt;
97 i = a; // expected-error{{incompatible type assigning 'struct A', expected 'int'}}
98}
99