blob: 553e743446dd5198f4559c24abcd0bd109b7927e [file] [log] [blame]
// { dg-do compile { target c++17 } }
// Copyright (C) 2016-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/>.
#include <type_traits>
#include <testsuite_tr1.h>
#ifndef __cpp_lib_is_swappable
# error "Feature-test macro for is_swappable_with missing"
#elif __cpp_lib_is_swappable != 201603
# error "Feature-test macro for is_swappable_with has wrong value"
#endif
namespace funny {
struct T0 {};
void swap(T0, T0);
struct T1 {};
struct T2 {};
void swap(T1, T2);
void swap(T2, T1);
struct BoolLike {};
void swap(BoolLike, bool&);
void swap(bool&, BoolLike);
struct F0 {};
void swap(F0, F0) = delete;
struct F1 {};
void swap(F0, F1) = delete;
void swap(F1, F0) = delete;
struct F2 {};
struct F3 {};
void swap(F2, F3);
void swap(F3, F2) = delete;
struct F4
{
friend void swap(F4, F4) = delete;
};
}
void test01()
{
using std::is_swappable_with;
using namespace __gnu_test;
// Positive tests.
static_assert(test_property<is_swappable_with, int&, int&>(true), "");
static_assert(test_property<is_swappable_with, funny::T0,
funny::T0>(true), "");
static_assert(test_property<is_swappable_with, funny::T0,
const funny::T0>(true), "");
static_assert(test_property<is_swappable_with, funny::T1,
funny::T2>(true), "");
static_assert(test_property<is_swappable_with, funny::T2,
funny::T1>(true), "");
static_assert(test_property<is_swappable_with, funny::BoolLike,
bool&>(true), "");
static_assert(test_property<is_swappable_with, const funny::BoolLike,
bool&>(true), "");
// Negative tests.
static_assert(test_property<is_swappable_with, int, int>(false), "");
static_assert(test_property<is_swappable_with, int&, unsigned&>(false), "");
static_assert(test_property<is_swappable_with, const int&,
const int&>(false), "");
static_assert(test_property<is_swappable_with, funny::F0,
funny::F0>(false), "");
static_assert(test_property<is_swappable_with, funny::F0,
const funny::F0>(false), "");
static_assert(test_property<is_swappable_with, funny::T0,
funny::T1>(false), "");
static_assert(test_property<is_swappable_with, funny::F0,
funny::F1>(false), "");
static_assert(test_property<is_swappable_with, funny::F0,
const funny::F1>(false), "");
static_assert(test_property<is_swappable_with, const funny::F0,
funny::F1>(false), "");
static_assert(test_property<is_swappable_with, funny::F2,
funny::F3>(false), "");
static_assert(test_property<is_swappable_with, funny::F2,
const funny::F3>(false), "");
static_assert(test_property<is_swappable_with, const funny::F2,
funny::F3>(false), "");
static_assert(test_property<is_swappable_with, funny::F4,
funny::F4>(false), "");
static_assert(test_property<is_swappable_with, funny::BoolLike,
funny::BoolLike>(false), "");
}