1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li struct A { 3*67e74705SXin Li }; 4*67e74705SXin Li 5*67e74705SXin Li struct ConvertibleToA { 6*67e74705SXin Li operator A(); 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li struct ConvertibleToConstA { 10*67e74705SXin Li operator const A(); 11*67e74705SXin Li }; 12*67e74705SXin Li 13*67e74705SXin Li struct B { 14*67e74705SXin Li B& operator=(B&); // expected-note 4 {{candidate function}} 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li struct ConvertibleToB { 18*67e74705SXin Li operator B(); 19*67e74705SXin Li }; 20*67e74705SXin Li 21*67e74705SXin Li struct ConvertibleToBref { 22*67e74705SXin Li operator B&(); 23*67e74705SXin Li }; 24*67e74705SXin Li 25*67e74705SXin Li struct ConvertibleToConstB { 26*67e74705SXin Li operator const B(); 27*67e74705SXin Li }; 28*67e74705SXin Li 29*67e74705SXin Li struct ConvertibleToConstBref { 30*67e74705SXin Li operator const B&(); 31*67e74705SXin Li }; 32*67e74705SXin Li 33*67e74705SXin Li struct C { 34*67e74705SXin Li int operator=(int); // expected-note{{candidate function}} 35*67e74705SXin Li long operator=(long); // expected-note{{candidate function}} 36*67e74705SXin Li int operator+=(int); // expected-note{{candidate function}} 37*67e74705SXin Li int operator+=(long); // expected-note{{candidate function}} 38*67e74705SXin Li }; 39*67e74705SXin Li 40*67e74705SXin Li struct D { 41*67e74705SXin Li D& operator+=(const D &); 42*67e74705SXin Li }; 43*67e74705SXin Li 44*67e74705SXin Li struct ConvertibleToInt { 45*67e74705SXin Li operator int(); 46*67e74705SXin Li }; 47*67e74705SXin Li test()48*67e74705SXin Livoid test() { 49*67e74705SXin Li A a, na; 50*67e74705SXin Li const A constA = A(); 51*67e74705SXin Li ConvertibleToA convertibleToA; 52*67e74705SXin Li ConvertibleToConstA convertibleToConstA; 53*67e74705SXin Li 54*67e74705SXin Li B b, nb; 55*67e74705SXin Li const B constB = B(); 56*67e74705SXin Li ConvertibleToB convertibleToB; 57*67e74705SXin Li ConvertibleToBref convertibleToBref; 58*67e74705SXin Li ConvertibleToConstB convertibleToConstB; 59*67e74705SXin Li ConvertibleToConstBref convertibleToConstBref; 60*67e74705SXin Li 61*67e74705SXin Li C c, nc; 62*67e74705SXin Li const C constC = C(); 63*67e74705SXin Li 64*67e74705SXin Li D d, nd; 65*67e74705SXin Li const D constD = D(); 66*67e74705SXin Li 67*67e74705SXin Li ConvertibleToInt convertibleToInt; 68*67e74705SXin Li 69*67e74705SXin Li na = a; 70*67e74705SXin Li na = constA; 71*67e74705SXin Li na = convertibleToA; 72*67e74705SXin Li na = convertibleToConstA; 73*67e74705SXin Li na += a; // expected-error{{no viable overloaded '+='}} 74*67e74705SXin Li 75*67e74705SXin Li nb = b; 76*67e74705SXin Li nb = constB; // expected-error{{no viable overloaded '='}} 77*67e74705SXin Li nb = convertibleToB; // expected-error{{no viable overloaded '='}} 78*67e74705SXin Li nb = convertibleToBref; 79*67e74705SXin Li nb = convertibleToConstB; // expected-error{{no viable overloaded '='}} 80*67e74705SXin Li nb = convertibleToConstBref; // expected-error{{no viable overloaded '='}} 81*67e74705SXin Li 82*67e74705SXin Li nc = c; 83*67e74705SXin Li nc = constC; 84*67e74705SXin Li nc = 1; 85*67e74705SXin Li nc = 1L; 86*67e74705SXin Li nc = 1.0; // expected-error{{use of overloaded operator '=' is ambiguous}} 87*67e74705SXin Li nc += 1; 88*67e74705SXin Li nc += 1L; 89*67e74705SXin Li nc += 1.0; // expected-error{{use of overloaded operator '+=' is ambiguous}} 90*67e74705SXin Li 91*67e74705SXin Li nd = d; 92*67e74705SXin Li nd += d; 93*67e74705SXin Li nd += constD; 94*67e74705SXin Li 95*67e74705SXin Li int i; 96*67e74705SXin Li i = convertibleToInt; 97*67e74705SXin Li i = a; // expected-error{{assigning to 'int' from incompatible type 'A'}} 98*67e74705SXin Li } 99*67e74705SXin Li 100*67e74705SXin Li // <rdar://problem/8315440>: Don't crash 101*67e74705SXin Li namespace test1 { 102*67e74705SXin Li template<typename T> class A : public unknown::X { // expected-error {{undeclared identifier 'unknown'}} expected-error {{expected class name}} A(UndeclaredType n)103*67e74705SXin Li A(UndeclaredType n) : X(n) {} // expected-error {{unknown type name 'UndeclaredType'}} 104*67e74705SXin Li }; 105*67e74705SXin Li template<typename T> class B : public A<T> { foo()106*67e74705SXin Li virtual void foo() {} 107*67e74705SXin Li }; 108*67e74705SXin Li extern template class A<char>; 109*67e74705SXin Li extern template class B<char>; 110*67e74705SXin Li } 111