1d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//===----------------------------------------------------------------------===//
2d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//
3d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//                     The LLVM Compiler Infrastructure
4d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//
5d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
7d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//
8d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//===----------------------------------------------------------------------===//
9d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
10d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// <vector>
11d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
12d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// void swap(vector& c)
13d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//     noexcept(!allocator_type::propagate_on_container_swap::value ||
14d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//              __is_nothrow_swappable<allocator_type>::value);
157d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow//
167d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow//  In C++17, the standard says that swap shall have:
177d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow//     noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value ||
187d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow//              allocator_traits<Allocator>::is_always_equal::value);
19d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
20d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// This tests a conforming extension
21d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
22d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#include <vector>
23d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#include <cassert>
24d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
251b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow#include "test_allocator.h"
26d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
27d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnanttemplate <class T>
28d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnantstruct some_alloc
29d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant{
30d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    typedef T value_type;
31d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
32d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    some_alloc() {}
33d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    some_alloc(const some_alloc&);
34d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    void deallocate(void*, unsigned) {}
35d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
36d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    typedef std::true_type propagate_on_container_swap;
37d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant};
38d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
397d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clowtemplate <class T>
407d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clowstruct some_alloc2
417d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow{
427d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    typedef T value_type;
437d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow
447d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    some_alloc2() {}
457d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    some_alloc2(const some_alloc2&);
467d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    void deallocate(void*, unsigned) {}
477d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow
487d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    typedef std::false_type propagate_on_container_swap;
497d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    typedef std::true_type is_always_equal;
507d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow};
517d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow
52d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnantint main()
53d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant{
54d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#if __has_feature(cxx_noexcept)
55d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
56d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        typedef std::vector<bool> C;
57d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        C c1, c2;
58d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        static_assert(noexcept(swap(c1, c2)), "");
59d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
60d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
61d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        typedef std::vector<bool, test_allocator<bool>> C;
62d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        C c1, c2;
63d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        static_assert(noexcept(swap(c1, c2)), "");
64d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
65d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
66d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        typedef std::vector<bool, other_allocator<bool>> C;
67d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        C c1, c2;
68d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        static_assert(noexcept(swap(c1, c2)), "");
69d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
70d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
71d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        typedef std::vector<bool, some_alloc<bool>> C;
72d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        C c1, c2;
737d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#if TEST_STD_VER >= 14
747d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    //  In c++14, if POCS is set, swapping the allocator is required not to throw
757d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow        static_assert( noexcept(swap(c1, c2)), "");
767d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#else
77d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        static_assert(!noexcept(swap(c1, c2)), "");
787d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#endif
79d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
807d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#if TEST_STD_VER >= 14
817d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    {
827d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow        typedef std::vector<bool, some_alloc2<bool>> C;
837d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow        C c1, c2;
847d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    //  if the allocators are always equal, then the swap can be noexcept
857d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow        static_assert( noexcept(swap(c1, c2)), "");
867d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow    }
877d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#endif
887d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow
89d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#endif
90d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant}
91