]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/strings/basic.string/string.nonmembers/string.special/swap_noexcept.pass.cpp
Vendor import of libc++ release_39 branch r276489:
[FreeBSD/FreeBSD.git] / test / std / strings / basic.string / string.nonmembers / string.special / swap_noexcept.pass.cpp
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // UNSUPPORTED: c++98, c++03
11
12 // <string>
13
14 // void swap(basic_string& c)
15 //     noexcept(!allocator_type::propagate_on_container_swap::value ||
16 //              __is_nothrow_swappable<allocator_type>::value);
17 //
18 //  In C++17, the standard says that swap shall have:
19 //     noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value ||
20 //              allocator_traits<Allocator>::is_always_equal::value);
21
22 // This tests a conforming extension
23
24 #include <string>
25 #include <cassert>
26
27 #include "test_macros.h"
28 #include "test_allocator.h"
29
30 template <class T>
31 struct some_alloc
32 {
33     typedef T value_type;
34
35     some_alloc() {}
36     some_alloc(const some_alloc&);
37     void deallocate(void*, unsigned) {}
38
39     typedef std::true_type propagate_on_container_swap;
40 };
41
42 template <class T>
43 struct some_alloc2
44 {
45     typedef T value_type;
46
47     some_alloc2() {}
48     some_alloc2(const some_alloc2&);
49     void deallocate(void*, unsigned) {}
50
51     typedef std::false_type propagate_on_container_swap;
52     typedef std::true_type is_always_equal;
53 };
54
55 int main()
56 {
57     {
58         typedef std::string C;
59         C c1, c2;
60         static_assert(noexcept(swap(c1, c2)), "");
61     }
62     {
63         typedef std::basic_string<char, std::char_traits<char>, test_allocator<char>> C;
64         C c1, c2;
65         static_assert(noexcept(swap(c1, c2)), "");
66     }
67     {
68         typedef std::basic_string<char, std::char_traits<char>, some_alloc<char>> C;
69         C c1, c2;
70 #if TEST_STD_VER >= 14
71     //  In c++14, if POCS is set, swapping the allocator is required not to throw
72         static_assert( noexcept(swap(c1, c2)), "");
73 #else
74         static_assert(!noexcept(swap(c1, c2)), "");
75 #endif
76     }
77 #if TEST_STD_VER >= 14
78     {
79         typedef std::basic_string<char, std::char_traits<char>, some_alloc2<char>> C;
80         C c1, c2;
81     //  if the allocators are always equal, then the swap can be noexcept
82         static_assert( noexcept(swap(c1, c2)), "");
83     }
84 #endif
85 }