blob: eaf9df47008797743cf2934abcb6934a4294ede2 [file] [log] [blame]
// 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>&>(), "" );