| // Copyright (C) 2018-2021 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 |
| // <http://www.gnu.org/licenses/>. |
| |
| // { dg-do compile { target c++11 } } |
| |
| #include <tuple> |
| #include <testsuite_tr1.h> |
| |
| 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<typename T> |
| constexpr bool copy() { return std::is_copy_assignable<T>::value; } |
| |
| // Move assigmment: |
| template<typename T> |
| constexpr bool move() { return std::is_move_assignable<T>::value; } |
| |
| static_assert( copy<tuple<>>(), ""); |
| static_assert( move<tuple<>>(), ""); |
| |
| static_assert( copy<tuple<int>>(), ""); |
| static_assert( copy<tuple<AnyAssign>>(), ""); |
| static_assert( copy<tuple<int, int>>(), ""); |
| static_assert( copy<tuple<AnyAssign, AnyAssign>>(), ""); |
| static_assert( copy<tuple<int, AnyAssign>>(), ""); |
| static_assert( copy<tuple<AnyAssign, int>>(), ""); |
| static_assert( copy<tuple<int, int, int>>(), ""); |
| static_assert( copy<tuple<AnyAssign, AnyAssign, AnyAssign>>(), ""); |
| static_assert( copy<tuple<int, AnyAssign, AnyAssign>>(), ""); |
| static_assert( copy<tuple<AnyAssign, int, AnyAssign>>(), ""); |
| static_assert( copy<tuple<AnyAssign, AnyAssign, int>>(), ""); |
| |
| static_assert( move<tuple<int>>(), ""); |
| static_assert( move<tuple<AnyAssign>>(), ""); |
| static_assert( move<tuple<int, int>>(), ""); |
| static_assert( move<tuple<AnyAssign, AnyAssign>>(), ""); |
| static_assert( move<tuple<int, AnyAssign>>(), ""); |
| static_assert( move<tuple<AnyAssign, int>>(), ""); |
| static_assert( move<tuple<int, int, int>>(), ""); |
| static_assert( move<tuple<AnyAssign, AnyAssign, AnyAssign>>(), ""); |
| static_assert( move<tuple<int, AnyAssign, AnyAssign>>(), ""); |
| static_assert( move<tuple<AnyAssign, int, AnyAssign>>(), ""); |
| static_assert( move<tuple<AnyAssign, AnyAssign, int>>(), ""); |
| |
| static_assert( ! copy<tuple<DelCopyAssign>>(), ""); |
| static_assert( ! copy<tuple<DelCopyAssign, int>>(), ""); |
| static_assert( ! copy<tuple<int, DelCopyAssign>>(), ""); |
| static_assert( ! copy<tuple<DelCopyAssign, int, int>>(), ""); |
| static_assert( ! copy<tuple<int, DelCopyAssign, int>>(), ""); |
| static_assert( ! copy<tuple<int, int, DelCopyAssign>>(), ""); |
| |
| static_assert( move<tuple<DelCopyAssign>>(), ""); |
| static_assert( move<tuple<DelCopyAssign, int>>(), ""); |
| static_assert( move<tuple<int, DelCopyAssign>>(), ""); |
| static_assert( move<tuple<DelCopyAssign, int, int>>(), ""); |
| static_assert( move<tuple<int, DelCopyAssign, int>>(), ""); |
| static_assert( move<tuple<int, int, DelCopyAssign>>(), ""); |
| |
| static_assert( ! move<tuple<CopyConsOnlyType>>(), ""); |
| static_assert( ! move<tuple<CopyConsOnlyType, int>>(), ""); |
| static_assert( ! move<tuple<int, CopyConsOnlyType>>(), ""); |
| static_assert( ! move<tuple<CopyConsOnlyType, int, int>>(), ""); |
| static_assert( ! move<tuple<int, CopyConsOnlyType, int>>(), ""); |
| static_assert( ! move<tuple<int, int, CopyConsOnlyType>>(), ""); |
| |
| // Assignment from different types of tuple (and pair): |
| template<typename To, typename From> |
| constexpr bool assign() { return std::is_assignable<To&, From>::value; } |
| |
| // 0-tuples |
| static_assert( ! assign<tuple<>, tuple<int>>(), "" ); |
| static_assert( ! assign<tuple<>, const tuple<int>&>(), "" ); |
| |
| // 1-tuples |
| static_assert( ! assign<tuple<int>, tuple<>>(), "" ); |
| static_assert( ! assign<tuple<int>, const tuple<>&>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign>, tuple<>>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign>, tuple<int, int>>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign>, pair<int, int>>(), "" ); |
| |
| static_assert( ! assign<tuple<void*>, tuple<int>>(), "" ); |
| static_assert( ! assign<tuple<void*>, const tuple<int>&>(), "" ); |
| |
| static_assert( assign<tuple<long>, tuple<int>>(), "" ); |
| static_assert( assign<tuple<long>, tuple<int>&>(), "" ); |
| static_assert( assign<tuple<long>, const tuple<int>>(), "" ); |
| static_assert( assign<tuple<long>, const tuple<int>&>(), "" ); |
| |
| // 2-tuples |
| static_assert( assign<tuple<long, long>, tuple<int, int>>(), "" ); |
| static_assert( assign<tuple<long, long>, tuple<int, int>&>(), "" ); |
| static_assert( assign<tuple<long, long>, const tuple<int, int>>(), "" ); |
| static_assert( assign<tuple<long, long>, const tuple<int, int>&>(), "" ); |
| |
| static_assert( assign<tuple<long, long>, pair<int, int>>(), "" ); |
| static_assert( assign<tuple<long, long>, const pair<int, int>&>(), "" ); |
| static_assert( assign<tuple<long, long>, pair<int, int>>(), "" ); |
| static_assert( assign<tuple<long, long>, const pair<int, int>&&>(), "" ); |
| |
| static_assert( assign<tuple<DelCopyAssign, AnyAssign>, |
| tuple<DelCopyAssign, int>>(), "" ); |
| static_assert( ! assign<tuple<DelCopyAssign, AnyAssign>, |
| tuple<DelCopyAssign, int>&>(), "" ); |
| static_assert( ! assign<tuple<DelCopyAssign, AnyAssign>, |
| const tuple<DelCopyAssign, int>&>(), "" ); |
| static_assert( ! assign<tuple<DelCopyAssign, AnyAssign>, |
| const tuple<DelCopyAssign, int>&&>(), "" ); |
| |
| static_assert( assign<tuple<AnyAssign, DelCopyAssign>, |
| tuple<int, DelCopyAssign>>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign>, |
| tuple<int, DelCopyAssign>&>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign>, |
| const tuple<int, DelCopyAssign>&>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign>, |
| const tuple<int, DelCopyAssign>&&>(), "" ); |
| |
| static_assert( ! assign<tuple<void*, int>, |
| tuple<int, int>>(), "" ); |
| static_assert( ! assign<tuple<void*, int>, |
| const tuple<int, int>&>(), "" ); |
| |
| static_assert( assign<tuple<DelCopyAssign, AnyAssign>, |
| pair<DelCopyAssign, int>>(), "" ); |
| static_assert( ! assign<tuple<DelCopyAssign, AnyAssign>, |
| pair<DelCopyAssign, int>&>(), "" ); |
| static_assert( ! assign<tuple<DelCopyAssign, AnyAssign>, |
| const pair<DelCopyAssign, int>&>(), "" ); |
| static_assert( ! assign<tuple<DelCopyAssign, AnyAssign>, |
| const pair<DelCopyAssign, int>&&>(), "" ); |
| |
| static_assert( assign<tuple<AnyAssign, DelCopyAssign>, |
| pair<int, DelCopyAssign>>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign>, |
| pair<int, DelCopyAssign>&>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign>, |
| const pair<int, DelCopyAssign>&>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign>, |
| const pair<int, DelCopyAssign>&&>(), "" ); |
| |
| static_assert( ! assign<tuple<void*, int>, |
| pair<int, int>>(), "" ); |
| static_assert( ! assign<tuple<void*, int>, |
| const pair<int, int>&>(), "" ); |
| |
| // 3-tuples |
| static_assert( assign<tuple<AnyAssign, DelCopyAssign, AnyAssign>, |
| tuple<int, DelCopyAssign, int>>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign, AnyAssign>, |
| tuple<int, DelCopyAssign, int>&>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign, AnyAssign>, |
| const tuple<int, DelCopyAssign, int>&>(), "" ); |
| static_assert( ! assign<tuple<AnyAssign, DelCopyAssign, AnyAssign>, |
| const tuple<int, DelCopyAssign, int>&&>(), "" ); |
| |
| static_assert( ! assign<tuple<int, void*, int>, |
| tuple<int, int, int>>(), "" ); |
| static_assert( ! assign<tuple<int, void*, int>, |
| const tuple<int, int, int>&>(), "" ); |