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