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