blob: 54cb5e853a8108bdadc477df9a421288ee6c729a [file] [log] [blame]
Howard Hinnant1468b662010-11-19 22:17:28 +00001//===----------------------------------------------------------------------===//
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_trivially_move_constructible
13
14#include <type_traits>
15
16template <class T>
17void test_is_trivially_move_constructible()
18{
19 static_assert( std::is_trivially_move_constructible<T>::value, "");
Howard Hinnant1468b662010-11-19 22:17:28 +000020}
21
22template <class T>
23void test_has_not_trivial_move_constructor()
24{
25 static_assert(!std::is_trivially_move_constructible<T>::value, "");
Howard Hinnant1468b662010-11-19 22:17:28 +000026}
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
Dan Albert1d4a1ed2016-05-25 22:36:09 -070056#if __has_feature(cxx_defaulted_functions)
Howard Hinnant43008392012-02-24 23:32:26 +000057
58struct MoveOnly1
59{
60 MoveOnly1(MoveOnly1&&);
61};
62
63struct MoveOnly2
64{
65 MoveOnly2(MoveOnly2&&) = default;
66};
67
68#endif
69
Howard Hinnant1468b662010-11-19 22:17:28 +000070int main()
71{
72 test_has_not_trivial_move_constructor<void>();
73 test_has_not_trivial_move_constructor<A>();
74 test_has_not_trivial_move_constructor<Abstract>();
75 test_has_not_trivial_move_constructor<NotEmpty>();
76
Howard Hinnant1468b662010-11-19 22:17:28 +000077 test_is_trivially_move_constructible<Union>();
78 test_is_trivially_move_constructible<Empty>();
79 test_is_trivially_move_constructible<int>();
80 test_is_trivially_move_constructible<double>();
81 test_is_trivially_move_constructible<int*>();
82 test_is_trivially_move_constructible<const int*>();
83 test_is_trivially_move_constructible<bit_zero>();
Howard Hinnant43008392012-02-24 23:32:26 +000084
Dan Albert1d4a1ed2016-05-25 22:36:09 -070085#if __has_feature(cxx_defaulted_functions)
Howard Hinnant43008392012-02-24 23:32:26 +000086 static_assert(!std::is_trivially_move_constructible<MoveOnly1>::value, "");
87 static_assert( std::is_trivially_move_constructible<MoveOnly2>::value, "");
88#endif
Howard Hinnant1468b662010-11-19 22:17:28 +000089}