// Copyright (C) 2018-2019 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&>(), "" );