111 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify %s 
 | |
| struct A {
 | |
| };
 | |
| 
 | |
| struct ConvertibleToA {
 | |
|   operator A();
 | |
| };
 | |
| 
 | |
| struct ConvertibleToConstA {
 | |
|   operator const A();
 | |
| };
 | |
| 
 | |
| struct B {
 | |
|   B& operator=(B&);  // expected-note 4 {{candidate function}}
 | |
| };
 | |
| 
 | |
| struct ConvertibleToB {
 | |
|   operator B();
 | |
| };
 | |
| 
 | |
| struct ConvertibleToBref {
 | |
|   operator B&();
 | |
| };
 | |
| 
 | |
| struct ConvertibleToConstB {
 | |
|   operator const B();
 | |
| };
 | |
| 
 | |
| struct ConvertibleToConstBref {
 | |
|   operator const B&();
 | |
| };
 | |
| 
 | |
| struct C {
 | |
|   int operator=(int); // expected-note{{candidate function}}
 | |
|   long operator=(long); // expected-note{{candidate function}}
 | |
|   int operator+=(int); // expected-note{{candidate function}}
 | |
|   int operator+=(long); // expected-note{{candidate function}}
 | |
| };
 | |
| 
 | |
| struct D {
 | |
|   D& operator+=(const D &);
 | |
| };
 | |
| 
 | |
| struct ConvertibleToInt {
 | |
|   operator int();
 | |
| };
 | |
| 
 | |
| void test() {
 | |
|   A a, na;
 | |
|   const A constA = A();
 | |
|   ConvertibleToA convertibleToA;
 | |
|   ConvertibleToConstA convertibleToConstA;
 | |
| 
 | |
|   B b, nb;
 | |
|   const B constB = B();
 | |
|   ConvertibleToB convertibleToB;
 | |
|   ConvertibleToBref convertibleToBref;
 | |
|   ConvertibleToConstB convertibleToConstB;
 | |
|   ConvertibleToConstBref convertibleToConstBref;
 | |
| 
 | |
|   C c, nc;
 | |
|   const C constC = C();
 | |
| 
 | |
|   D d, nd;
 | |
|   const D constD = D();
 | |
| 
 | |
|   ConvertibleToInt convertibleToInt;
 | |
| 
 | |
|   na = a;
 | |
|   na = constA;
 | |
|   na = convertibleToA;
 | |
|   na = convertibleToConstA;
 | |
|   na += a; // expected-error{{no viable overloaded '+='}}
 | |
| 
 | |
|   nb = b;
 | |
|   nb = constB;  // expected-error{{no viable overloaded '='}}
 | |
|   nb = convertibleToB; // expected-error{{no viable overloaded '='}}
 | |
|   nb = convertibleToBref;
 | |
|   nb = convertibleToConstB; // expected-error{{no viable overloaded '='}}
 | |
|   nb = convertibleToConstBref; // expected-error{{no viable overloaded '='}}
 | |
| 
 | |
|   nc = c;
 | |
|   nc = constC;
 | |
|   nc = 1;
 | |
|   nc = 1L;
 | |
|   nc = 1.0; // expected-error{{use of overloaded operator '=' is ambiguous}}
 | |
|   nc += 1;
 | |
|   nc += 1L;
 | |
|   nc += 1.0; // expected-error{{use of overloaded operator '+=' is ambiguous}}
 | |
| 
 | |
|   nd = d;
 | |
|   nd += d;
 | |
|   nd += constD;
 | |
| 
 | |
|   int i;
 | |
|   i = convertibleToInt;
 | |
|   i = a; // expected-error{{assigning to 'int' from incompatible type 'A'}}
 | |
| }
 | |
| 
 | |
| // <rdar://problem/8315440>: Don't crash
 | |
| namespace test1 {
 | |
|   template<typename T> class A : public unknown::X { // expected-error {{undeclared identifier 'unknown'}} expected-error {{expected class name}}
 | |
|     A(UndeclaredType n) : X(n) {} // expected-error {{unknown type name 'UndeclaredType'}}
 | |
|   };
 | |
|   template<typename T> class B : public A<T>     {
 | |
|     virtual void foo() {}
 | |
|   };
 | |
|   extern template class A<char>;
 | |
|   extern template class B<char>;
 | |
| }
 |