xref: /llvm-project/libcxx/test/std/containers/sequences/vector.bool/swap_noexcept.pass.cpp (revision 31cbe0f240f660f15602c96b787c58a26f17e179)
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