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// type_traits
11
12// is_move_constructible
13
14#include <type_traits>
15
16template <class T>
17void test_is_move_constructible()
18{
19    static_assert( std::is_move_constructible<T>::value, "");
20}
21
22template <class T>
23void test_is_not_move_constructible()
24{
25    static_assert(!std::is_move_constructible<T>::value, "");
26}
27
28class Empty
29{
30};
31
32class NotEmpty
33{
34public:
35    virtual ~NotEmpty();
36};
37
38union Union {};
39
40struct bit_zero
41{
42    int :  0;
43};
44
45class Abstract
46{
47public:
48    virtual ~Abstract() = 0;
49};
50
51struct A
52{
53    A(const A&);
54};
55
56struct B
57{
58#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
59    B(B&&);
60#endif
61};
62
63int main()
64{
65    test_is_not_move_constructible<char[3]>();
66    test_is_not_move_constructible<char[]>();
67    test_is_not_move_constructible<void>();
68    test_is_not_move_constructible<Abstract>();
69
70    test_is_move_constructible<A>();
71    test_is_move_constructible<int&>();
72    test_is_move_constructible<Union>();
73    test_is_move_constructible<Empty>();
74    test_is_move_constructible<int>();
75    test_is_move_constructible<double>();
76    test_is_move_constructible<int*>();
77    test_is_move_constructible<const int*>();
78    test_is_move_constructible<NotEmpty>();
79    test_is_move_constructible<bit_zero>();
80    test_is_move_constructible<B>();
81}
82