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