//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // template // concept indirectly_swappable; #include #include "test_macros.h" template struct PointerTo { using value_type = ValueType; T& operator*() const; }; static_assert(std::indirectly_swappable>); static_assert(std::indirectly_swappable, PointerTo>); struct B; struct A { friend void iter_swap(const PointerTo&, const PointerTo&); }; // Is indirectly swappable. struct B { friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&); }; // Valid except ranges::iter_swap(i2, i1). struct C { friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&) = delete; }; // Valid except ranges::iter_swap(i1, i2). struct D { friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&) = delete; friend void iter_swap(const PointerTo&, const PointerTo&); }; // Valid except ranges::iter_swap(i2, i2). struct E { E operator=(const E&) = delete; friend void iter_swap(const PointerTo&, const PointerTo&) = delete; friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&); }; struct F { friend void iter_swap(const PointerTo&, const PointerTo&) = delete; }; // Valid except ranges::iter_swap(i1, i1). struct G { friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&); friend void iter_swap(const PointerTo&, const PointerTo&); }; static_assert( std::indirectly_swappable, PointerTo>); static_assert(!std::indirectly_swappable, PointerTo>); static_assert(!std::indirectly_swappable, PointerTo>); static_assert(!std::indirectly_swappable, PointerTo>); static_assert(!std::indirectly_swappable, PointerTo>);