1*8fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s 24aa2dc41SDouglas Gregor 34aa2dc41SDouglas Gregor // Make sure that copy constructors and assignment operators are properly 44aa2dc41SDouglas Gregor // generated when there is a matching 54aa2dc41SDouglas Gregor 64aa2dc41SDouglas Gregor // PR5072 74aa2dc41SDouglas Gregor template<typename T> 84aa2dc41SDouglas Gregor struct X { 94aa2dc41SDouglas Gregor template<typename U> XX104aa2dc41SDouglas Gregor X(const X<U>& other) 114aa2dc41SDouglas Gregor : value(other.value + 1) { } // expected-error{{binary expression}} 124aa2dc41SDouglas Gregor 134aa2dc41SDouglas Gregor template<typename U> operator =X144aa2dc41SDouglas Gregor X& operator=(const X<U>& other) { 154aa2dc41SDouglas Gregor value = other.value + 1; // expected-error{{binary expression}} 164aa2dc41SDouglas Gregor return *this; 174aa2dc41SDouglas Gregor } 184aa2dc41SDouglas Gregor 194aa2dc41SDouglas Gregor T value; 204aa2dc41SDouglas Gregor }; 214aa2dc41SDouglas Gregor 224aa2dc41SDouglas Gregor struct Y {}; 234aa2dc41SDouglas Gregor test0(X<int Y::* > x)244aa2dc41SDouglas GregorX<int Y::*> test0(X<int Y::*> x) { return x; } test1(X<long> x)254aa2dc41SDouglas GregorX<int> test1(X<long> x) { return x; } 264aa2dc41SDouglas Gregor 274aa2dc41SDouglas Gregor test2(X<int Y::* > x)284aa2dc41SDouglas GregorX<int> test2(X<int Y::*> x) { 294aa2dc41SDouglas Gregor return x; // expected-note{{instantiation}} 304aa2dc41SDouglas Gregor } 314aa2dc41SDouglas Gregor test3(X<int> & x,X<int> xi,X<long> xl,X<int Y::* > xmptr)324aa2dc41SDouglas Gregorvoid test3(X<int> &x, X<int> xi, X<long> xl, X<int Y::*> xmptr) { 334aa2dc41SDouglas Gregor x = xi; 344aa2dc41SDouglas Gregor x = xl; 354aa2dc41SDouglas Gregor x = xmptr; // expected-note{{instantiation}} 364aa2dc41SDouglas Gregor } 3762b885d4SDouglas Gregor 3862b885d4SDouglas Gregor struct X1 { 3962b885d4SDouglas Gregor X1 &operator=(const X1&); 4062b885d4SDouglas Gregor }; 4162b885d4SDouglas Gregor 4262b885d4SDouglas Gregor template<typename T> 4362b885d4SDouglas Gregor struct X2 : X1 { 4462b885d4SDouglas Gregor template<typename U> X2 &operator=(const U&); 4562b885d4SDouglas Gregor }; 4662b885d4SDouglas Gregor 4762b885d4SDouglas Gregor struct X3 : X2<int> { 4862b885d4SDouglas Gregor }; 4962b885d4SDouglas Gregor test_X2(X3 & to,X3 from)5062b885d4SDouglas Gregorvoid test_X2(X3 &to, X3 from) { 5162b885d4SDouglas Gregor to = from; 5262b885d4SDouglas Gregor } 53