1// RUN: %clang_cc1 -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 {
14  B& operator=(B&);  // expected-note 4 {{candidate function}}
15};
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 = A();
51  ConvertibleToA convertibleToA;
52  ConvertibleToConstA convertibleToConstA;
53
54  B b, nb;
55  const B constB = B();
56  ConvertibleToB convertibleToB;
57  ConvertibleToBref convertibleToBref;
58  ConvertibleToConstB convertibleToConstB;
59  ConvertibleToConstBref convertibleToConstBref;
60
61  C c, nc;
62  const C constC = C();
63
64  D d, nd;
65  const D constD = D();
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{{assigning to 'int' from incompatible type 'A'}}
98}
99
100// <rdar://problem/8315440>: Don't crash
101namespace test1 {
102  template<typename T> class A : public unknown::X { // expected-error {{undeclared identifier 'unknown'}} expected-error {{expected class name}}
103    A(UndeclaredType n) : X(n) {} // expected-error {{unknown type name 'UndeclaredType'}}
104  };
105  template<typename T> class B : public A<T>     {
106    virtual void foo() {}
107  };
108  extern template class A<char>;
109  extern template class B<char>;
110}
111