| // Basic runtime test for implicit move constructor |
| // { dg-do run { target c++11 } } |
| |
| int m; |
| |
| struct A |
| { |
| A() = default; |
| A(A&&) { ++m; } |
| A& operator=(A&&) { ++m; return *this; } |
| }; |
| |
| struct B |
| { |
| B() = default; |
| B(const B&); |
| B(B&&) { ++m; } |
| B& operator=(const B&); |
| B& operator=(B&&) { ++m; return *this; } |
| }; |
| |
| struct C |
| { |
| C() = default; |
| C(C&); |
| C(C&&) { ++m; } |
| C& operator=(C&); |
| C& operator=(C&&) { ++m; return *this; } |
| }; |
| |
| struct D: public A, public B |
| { |
| C c; |
| int i; |
| }; |
| |
| struct E: public A, public B |
| { |
| C c; |
| int i; |
| E() = default; |
| E(E&&) = default; |
| E& operator=(E&&) = default; |
| }; |
| |
| int main() |
| { |
| D d1; |
| D d2 (static_cast<D&&>(d1)); |
| d1 = static_cast<D&&>(d2); |
| E e1; |
| E e2 (static_cast<E&&>(e1)); |
| e1 = static_cast<E&&>(e2); |
| return m != 12; |
| } |