1// { dg-options "-std=gnu++11" }
2
3// Copyright (C) 2008-2015 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3.  If not see
18// <http://www.gnu.org/licenses/>.
19
20#include <tuple>
21#include <utility>
22
23struct MoveOnly
24{
25  MoveOnly () { }
26
27  MoveOnly (MoveOnly&&) { }
28
29  MoveOnly& operator=(MoveOnly&&)
30  { return *this; }
31
32  MoveOnly(MoveOnly const&) = delete;
33  MoveOnly& operator=(MoveOnly const&) = delete;
34};
35
36MoveOnly
37make_move_only ()
38{ return MoveOnly(); }
39
40// http://gcc.gnu.org/ml/libstdc++/2008-02/msg00046.html
41void test01()
42{
43  typedef std::tuple<MoveOnly> move_only_tuple;
44
45  move_only_tuple t1(make_move_only());
46  move_only_tuple t2(std::move(t1));
47  move_only_tuple t3 = std::move(t2);
48  t1 = std::move(t3);
49
50  typedef std::tuple<MoveOnly, MoveOnly> move_only_tuple2;
51
52  move_only_tuple2 t4(make_move_only(), make_move_only());
53  move_only_tuple2 t5(std::move(t4));
54  move_only_tuple2 t6 = std::move(t5);
55  t4 = std::move(t6);
56}
57
58int main()
59{
60  test01();
61  return 0;
62}
63