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