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// <set>
11
12// set& operator=(set&& c)
13//     noexcept(
14//          allocator_type::propagate_on_container_move_assignment::value &&
15//          is_nothrow_move_assignable<allocator_type>::value &&
16//          is_nothrow_move_assignable<key_compare>::value);
17
18// This tests a conforming extension
19
20#include <set>
21#include <cassert>
22
23#include "../../../MoveOnly.h"
24#include "test_allocator.h"
25
26template <class T>
27struct some_comp
28{
29    typedef T value_type;
30    some_comp& operator=(const some_comp&);
31};
32
33int main()
34{
35#if __has_feature(cxx_noexcept)
36    {
37        typedef std::set<MoveOnly> C;
38        static_assert(std::is_nothrow_move_assignable<C>::value, "");
39    }
40    {
41        typedef std::set<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
42        static_assert(!std::is_nothrow_move_assignable<C>::value, "");
43    }
44    {
45        typedef std::set<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
46        static_assert(std::is_nothrow_move_assignable<C>::value, "");
47    }
48    {
49        typedef std::set<MoveOnly, some_comp<MoveOnly>> C;
50        static_assert(!std::is_nothrow_move_assignable<C>::value, "");
51    }
52#endif
53}
54