53 lines
		
	
	
		
			1016 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1016 B
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify %s
 | 
						|
 | 
						|
// Make sure that copy constructors and assignment operators are properly 
 | 
						|
// generated when there is a matching 
 | 
						|
 | 
						|
// PR5072
 | 
						|
template<typename T>
 | 
						|
struct X {
 | 
						|
  template<typename U> 
 | 
						|
  X(const X<U>& other) 
 | 
						|
    : value(other.value + 1) { } // expected-error{{binary expression}}
 | 
						|
 | 
						|
  template<typename U> 
 | 
						|
  X& operator=(const X<U>& other)  {
 | 
						|
    value = other.value + 1; // expected-error{{binary expression}}
 | 
						|
    return *this;
 | 
						|
  }
 | 
						|
  
 | 
						|
  T value;
 | 
						|
};
 | 
						|
 | 
						|
struct Y {};
 | 
						|
 | 
						|
X<int Y::*> test0(X<int Y::*> x) { return x; }
 | 
						|
X<int> test1(X<long> x) { return x; }
 | 
						|
 | 
						|
 | 
						|
X<int> test2(X<int Y::*> x) { 
 | 
						|
  return x; // expected-note{{instantiation}}
 | 
						|
}
 | 
						|
 | 
						|
void test3(X<int> &x, X<int> xi, X<long> xl, X<int Y::*> xmptr) {
 | 
						|
  x = xi;
 | 
						|
  x = xl;
 | 
						|
  x = xmptr; // expected-note{{instantiation}}
 | 
						|
}
 | 
						|
 | 
						|
struct X1 {
 | 
						|
  X1 &operator=(const X1&);
 | 
						|
};
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct X2 : X1 {
 | 
						|
  template<typename U> X2 &operator=(const U&);
 | 
						|
};
 | 
						|
 | 
						|
struct X3 : X2<int> {
 | 
						|
};
 | 
						|
 | 
						|
void test_X2(X3 &to, X3 from) {
 | 
						|
  to = from;
 | 
						|
}
 |