1b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//===----------------------------------------------------------------------===//
2b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//
3b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//                     The LLVM Compiler Infrastructure
4b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//
5b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//
8b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//===----------------------------------------------------------------------===//
9b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
10b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant// <set>
11b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
12b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant// void swap(set& c)
13b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//     noexcept(!allocator_type::propagate_on_container_swap::value ||
14b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant//              __is_nothrow_swappable<allocator_type>::value);
15b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
16b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant// This tests a conforming extension
17b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
18b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant#include <set>
19b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant#include <cassert>
20b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
21b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant#include "../../../MoveOnly.h"
221b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow#include "test_allocator.h"
23b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
24b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnanttemplate <class T>
25b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnantstruct some_comp
26b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant{
27b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    typedef T value_type;
28b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
29b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    some_comp() {}
30b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    some_comp(const some_comp&) {}
31b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    void deallocate(void*, unsigned) {}
32b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
33b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    typedef std::true_type propagate_on_container_swap;
34b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant};
35b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant
36b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnantint main()
37b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant{
38b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant#if __has_feature(cxx_noexcept)
39b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    {
40b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        typedef std::set<MoveOnly> C;
41b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        C c1, c2;
42b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        static_assert(noexcept(swap(c1, c2)), "");
43b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    }
44b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    {
45b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        typedef std::set<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
46b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        C c1, c2;
47b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        static_assert(noexcept(swap(c1, c2)), "");
48b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    }
49b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    {
50b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        typedef std::set<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
51b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        C c1, c2;
52b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        static_assert(noexcept(swap(c1, c2)), "");
53b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    }
54b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    {
55b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        typedef std::set<MoveOnly, some_comp<MoveOnly>> C;
56b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        C c1, c2;
57b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant        static_assert(!noexcept(swap(c1, c2)), "");
58b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant    }
59b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant#endif
60b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant}
61