// Copyright (C) 2018-2022 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-do compile { target c++11 } } #include #include using std::tuple; using std::pair; using __gnu_test::assign::AnyAssign; using __gnu_test::assign::DelAnyAssign; using __gnu_test::assign::DelCopyAssign; using __gnu_test::CopyConsOnlyType; // Copy assignment: template constexpr bool copy() { return std::is_copy_assignable::value; } // Move assigmment: template constexpr bool move() { return std::is_move_assignable::value; } static_assert( copy>(), ""); static_assert( move>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( copy>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( ! copy>(), ""); static_assert( ! copy>(), ""); static_assert( ! copy>(), ""); static_assert( ! copy>(), ""); static_assert( ! copy>(), ""); static_assert( ! copy>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( move>(), ""); static_assert( ! move>(), ""); static_assert( ! move>(), ""); static_assert( ! move>(), ""); static_assert( ! move>(), ""); static_assert( ! move>(), ""); static_assert( ! move>(), ""); // Assignment from different types of tuple (and pair): template constexpr bool assign() { return std::is_assignable::value; } // 0-tuples static_assert( ! assign, tuple>(), "" ); static_assert( ! assign, const tuple&>(), "" ); // 1-tuples static_assert( ! assign, tuple<>>(), "" ); static_assert( ! assign, const tuple<>&>(), "" ); static_assert( ! assign, tuple<>>(), "" ); static_assert( ! assign, tuple>(), "" ); static_assert( ! assign, pair>(), "" ); static_assert( ! assign, tuple>(), "" ); static_assert( ! assign, const tuple&>(), "" ); static_assert( assign, tuple>(), "" ); static_assert( assign, tuple&>(), "" ); static_assert( assign, const tuple>(), "" ); static_assert( assign, const tuple&>(), "" ); // 2-tuples static_assert( assign, tuple>(), "" ); static_assert( assign, tuple&>(), "" ); static_assert( assign, const tuple>(), "" ); static_assert( assign, const tuple&>(), "" ); static_assert( assign, pair>(), "" ); static_assert( assign, const pair&>(), "" ); static_assert( assign, pair>(), "" ); static_assert( assign, const pair&&>(), "" ); static_assert( assign, tuple>(), "" ); static_assert( ! assign, tuple&>(), "" ); static_assert( ! assign, const tuple&>(), "" ); static_assert( ! assign, const tuple&&>(), "" ); static_assert( assign, tuple>(), "" ); static_assert( ! assign, tuple&>(), "" ); static_assert( ! assign, const tuple&>(), "" ); static_assert( ! assign, const tuple&&>(), "" ); static_assert( ! assign, tuple>(), "" ); static_assert( ! assign, const tuple&>(), "" ); static_assert( assign, pair>(), "" ); static_assert( ! assign, pair&>(), "" ); static_assert( ! assign, const pair&>(), "" ); static_assert( ! assign, const pair&&>(), "" ); static_assert( assign, pair>(), "" ); static_assert( ! assign, pair&>(), "" ); static_assert( ! assign, const pair&>(), "" ); static_assert( ! assign, const pair&&>(), "" ); static_assert( ! assign, pair>(), "" ); static_assert( ! assign, const pair&>(), "" ); // 3-tuples static_assert( assign, tuple>(), "" ); static_assert( ! assign, tuple&>(), "" ); static_assert( ! assign, const tuple&>(), "" ); static_assert( ! assign, const tuple&&>(), "" ); static_assert( ! assign, tuple>(), "" ); static_assert( ! assign, const tuple&>(), "" );