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>;
 | 
						|
}
 |