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