15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
9*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03
10d513ad88SEric Fiselier
115a83710eSEric Fiselier // <vector>
125a83710eSEric Fiselier
135a83710eSEric Fiselier // void swap(vector& c)
145a83710eSEric Fiselier // noexcept(!allocator_type::propagate_on_container_swap::value ||
155a83710eSEric Fiselier // __is_nothrow_swappable<allocator_type>::value);
16e3fbe143SMarshall Clow //
17e3fbe143SMarshall Clow // In C++17, the standard says that swap shall have:
18e3fbe143SMarshall Clow // noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value ||
19e3fbe143SMarshall Clow // allocator_traits<Allocator>::is_always_equal::value);
205a83710eSEric Fiselier
215a83710eSEric Fiselier // This tests a conforming extension
225a83710eSEric Fiselier
235a83710eSEric Fiselier #include <vector>
242cd516e0SEric Fiselier #include <utility>
255a83710eSEric Fiselier #include <cassert>
265a83710eSEric Fiselier
27d513ad88SEric Fiselier #include "test_macros.h"
285a83710eSEric Fiselier #include "test_allocator.h"
295a83710eSEric Fiselier
305a83710eSEric Fiselier template <class T>
315a83710eSEric Fiselier struct some_alloc
325a83710eSEric Fiselier {
335a83710eSEric Fiselier typedef T value_type;
345a83710eSEric Fiselier
some_allocsome_alloc355a83710eSEric Fiselier some_alloc() {}
365a83710eSEric Fiselier some_alloc(const some_alloc&);
deallocatesome_alloc375a83710eSEric Fiselier void deallocate(void*, unsigned) {}
385a83710eSEric Fiselier
395a83710eSEric Fiselier typedef std::true_type propagate_on_container_swap;
405a83710eSEric Fiselier };
415a83710eSEric Fiselier
42e3fbe143SMarshall Clow template <class T>
43e3fbe143SMarshall Clow struct some_alloc2
44e3fbe143SMarshall Clow {
45e3fbe143SMarshall Clow typedef T value_type;
46e3fbe143SMarshall Clow
some_alloc2some_alloc247e3fbe143SMarshall Clow some_alloc2() {}
48e3fbe143SMarshall Clow some_alloc2(const some_alloc2&);
deallocatesome_alloc249e3fbe143SMarshall Clow void deallocate(void*, unsigned) {}
50e3fbe143SMarshall Clow
51e3fbe143SMarshall Clow typedef std::false_type propagate_on_container_swap;
52e3fbe143SMarshall Clow typedef std::true_type is_always_equal;
53e3fbe143SMarshall Clow };
54e3fbe143SMarshall Clow
main(int,char **)552df59c50SJF Bastien int main(int, char**)
565a83710eSEric Fiselier {
5703fe6e2dSStephan T. Lavavej #if defined(_LIBCPP_VERSION)
585a83710eSEric Fiselier {
595a83710eSEric Fiselier typedef std::vector<bool> C;
6003fe6e2dSStephan T. Lavavej static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");
615a83710eSEric Fiselier }
625a83710eSEric Fiselier {
635a83710eSEric Fiselier typedef std::vector<bool, test_allocator<bool>> C;
6403fe6e2dSStephan T. Lavavej static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");
655a83710eSEric Fiselier }
665a83710eSEric Fiselier {
675a83710eSEric Fiselier typedef std::vector<bool, other_allocator<bool>> C;
6803fe6e2dSStephan T. Lavavej static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");
695a83710eSEric Fiselier }
7003fe6e2dSStephan T. Lavavej #endif // _LIBCPP_VERSION
715a83710eSEric Fiselier {
72e3fbe143SMarshall Clow #if TEST_STD_VER >= 14
7303fe6e2dSStephan T. Lavavej #if defined(_LIBCPP_VERSION)
749ea675efSStephan T. Lavavej // In C++14, if POCS is set, swapping the allocator is required not to throw
7503fe6e2dSStephan T. Lavavej typedef std::vector<bool, some_alloc<bool>> C;
7603fe6e2dSStephan T. Lavavej static_assert( noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");
7703fe6e2dSStephan T. Lavavej #endif // _LIBCPP_VERSION
78e3fbe143SMarshall Clow #else
7903fe6e2dSStephan T. Lavavej typedef std::vector<bool, some_alloc<bool>> C;
802cd516e0SEric Fiselier static_assert(!noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");
81e3fbe143SMarshall Clow #endif
825a83710eSEric Fiselier }
83e3fbe143SMarshall Clow #if TEST_STD_VER >= 14
8403fe6e2dSStephan T. Lavavej #if defined(_LIBCPP_VERSION)
85e3fbe143SMarshall Clow {
86e3fbe143SMarshall Clow typedef std::vector<bool, some_alloc2<bool>> C;
87e3fbe143SMarshall Clow // if the allocators are always equal, then the swap can be noexcept
8803fe6e2dSStephan T. Lavavej static_assert( noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");
89e3fbe143SMarshall Clow }
9003fe6e2dSStephan T. Lavavej #endif // _LIBCPP_VERSION
91e3fbe143SMarshall Clow #endif
922df59c50SJF Bastien
932df59c50SJF Bastien return 0;
945a83710eSEric Fiselier }
95