1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// <vector>
10
11// vector& operator=(vector&& c)
12// noexcept(
13// allocator_type::propagate_on_container_move_assignment::value &&
14// is_nothrow_move_assignable<allocator_type>::value);
15
16// This tests a conforming extension
17
18// UNSUPPORTED: c++03
19
20#include <vector>
21#include <cassert>
22
23#include "test_macros.h"
24#include "test_allocator.h"
25
26template <class T>
27struct some_alloc
28{
29 typedef T value_type;
30 some_alloc(const some_alloc&);
31};
32
33template <class T>
34struct some_alloc2
35{
36 typedef T value_type;
37
38 some_alloc2() {}
39 some_alloc2(const some_alloc2&);
40 void deallocate(void*, unsigned) {}
41
42 typedef std::false_type propagate_on_container_move_assignment;
43 typedef std::true_type is_always_equal;
44};
45
46template <class T>
47struct some_alloc3
48{
49 typedef T value_type;
50
51 some_alloc3() {}
52 some_alloc3(const some_alloc3&);
53 void deallocate(void*, unsigned) {}
54
55 typedef std::false_type propagate_on_container_move_assignment;
56 typedef std::false_type is_always_equal;
57};
58
59int main(int, char**)
60{
61#if defined(_LIBCPP_VERSION)
62 {
63 typedef std::vector<bool> C;
64 static_assert(std::is_nothrow_move_assignable<C>::value, "");
65 }
66#endif // _LIBCPP_VERSION
67 {
68 typedef std::vector<bool, test_allocator<bool>> C;
69 static_assert(!std::is_nothrow_move_assignable<C>::value, "");
70 }
71#if defined(_LIBCPP_VERSION)
72 {
73 typedef std::vector<bool, other_allocator<bool>> C;
74 static_assert(std::is_nothrow_move_assignable<C>::value, "");
75 }
76#endif // _LIBCPP_VERSION
77 {
78#if TEST_STD_VER > 14
79#if defined(_LIBCPP_VERSION)
80 typedef std::vector<bool, some_alloc<bool>> C;
81 static_assert( std::is_nothrow_move_assignable<C>::value, "");
82#endif // _LIBCPP_VERSION
83#else
84 typedef std::vector<bool, some_alloc<bool>> C;
85 static_assert(!std::is_nothrow_move_assignable<C>::value, "");
86#endif
87 }
88#if TEST_STD_VER > 14
89#if defined(_LIBCPP_VERSION)
90 { // POCMA false, is_always_equal true
91 typedef std::vector<bool, some_alloc2<bool>> C;
92 static_assert( std::is_nothrow_move_assignable<C>::value, "");
93 }
94#endif // _LIBCPP_VERSION
95 { // POCMA false, is_always_equal false
96 typedef std::vector<bool, some_alloc3<bool>> C;
97 static_assert(!std::is_nothrow_move_assignable<C>::value, "");
98 }
99#endif
100
101 return 0;
102}
103

source code of libcxx/test/std/containers/sequences/vector.bool/move_assign_noexcept.pass.cpp