move_noexcept.pass.cpp revision d24c465beaec2fe9a0e365e6379cd5d3acaeb2ca
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// <unordered_map>
11
12// unordered_map(unordered_map&&)
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// UNSUPPORTED: c++98, c++03
19
20#include <unordered_map>
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(const some_comp&);
31    bool operator()(const T&, const T&) const { return false; }
32};
33
34template <class T>
35struct some_hash
36{
37    typedef T value_type;
38    some_hash();
39    some_hash(const some_hash&);
40};
41
42int main()
43{
44    {
45        typedef std::unordered_map<MoveOnly, MoveOnly> C;
46        static_assert(std::is_nothrow_move_constructible<C>::value, "");
47    }
48    {
49        typedef std::unordered_map<MoveOnly, MoveOnly, std::hash<MoveOnly>,
50                           std::equal_to<MoveOnly>, test_allocator<std::pair<const MoveOnly, MoveOnly>>> C;
51        static_assert(std::is_nothrow_move_constructible<C>::value, "");
52    }
53    {
54        typedef std::unordered_map<MoveOnly, MoveOnly, std::hash<MoveOnly>,
55                          std::equal_to<MoveOnly>, other_allocator<std::pair<const MoveOnly, MoveOnly>>> C;
56        static_assert(std::is_nothrow_move_constructible<C>::value, "");
57    }
58    {
59        typedef std::unordered_map<MoveOnly, MoveOnly, some_hash<MoveOnly>> C;
60        static_assert(!std::is_nothrow_move_constructible<C>::value, "");
61    }
62    {
63        typedef std::unordered_map<MoveOnly, MoveOnly, std::hash<MoveOnly>,
64                                                         some_comp<MoveOnly>> C;
65        static_assert(!std::is_nothrow_move_constructible<C>::value, "");
66    }
67}
68