xref: /llvm-project/clang/test/SemaTemplate/copy-ctor-assign.cpp (revision 8fbe78f6fc7b41d1a4228c126fcb522131150518)
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 Gregor X<int Y::*> test0(X<int Y::*> x) { return x; }
test1(X<long> x)254aa2dc41SDouglas Gregor X<int> test1(X<long> x) { return x; }
264aa2dc41SDouglas Gregor 
274aa2dc41SDouglas Gregor 
test2(X<int Y::* > x)284aa2dc41SDouglas Gregor X<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 Gregor void 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 Gregor void test_X2(X3 &to, X3 from) {
5162b885d4SDouglas Gregor   to = from;
5262b885d4SDouglas Gregor }
53