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