xref: /llvm-project/libcxx/test/std/concepts/concepts.object/movable.compile.pass.cpp (revision e1ce3dabf0c70d30a24f0586ddf2a965d730d30a)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03, c++11, c++14, c++17
10 // UNSUPPORTED: libcpp-no-concepts
11 
12 // template<class T>
13 // concept movable = see below;
14 
15 #include <concepts>
16 
17 #include <deque>
18 #include <forward_list>
19 #include <list>
20 #include <map>
21 #include <optional>
22 #include <unordered_map>
23 #include <vector>
24 
25 #ifndef _LIBCPP_HAS_NO_THREADS
26 #   include <mutex>
27 #endif
28 
29 #include "type_classification/moveconstructible.h"
30 #include "type_classification/movable.h"
31 
32 // Movable types
33 static_assert(std::movable<int>);
34 static_assert(std::movable<int volatile>);
35 static_assert(std::movable<int*>);
36 static_assert(std::movable<int const*>);
37 static_assert(std::movable<int volatile*>);
38 static_assert(std::movable<int const volatile*>);
39 static_assert(std::movable<int (*)()>);
40 
41 struct S {};
42 static_assert(std::movable<S>);
43 static_assert(std::movable<int S::*>);
44 static_assert(std::movable<int (S::*)()>);
45 static_assert(std::movable<int (S::*)() noexcept>);
46 static_assert(std::movable<int (S::*)() &>);
47 static_assert(std::movable<int (S::*)() & noexcept>);
48 static_assert(std::movable<int (S::*)() &&>);
49 static_assert(std::movable<int (S::*)() && noexcept>);
50 static_assert(std::movable<int (S::*)() const>);
51 static_assert(std::movable<int (S::*)() const noexcept>);
52 static_assert(std::movable<int (S::*)() const&>);
53 static_assert(std::movable<int (S::*)() const & noexcept>);
54 static_assert(std::movable<int (S::*)() const&&>);
55 static_assert(std::movable<int (S::*)() const && noexcept>);
56 static_assert(std::movable<int (S::*)() volatile>);
57 static_assert(std::movable<int (S::*)() volatile noexcept>);
58 static_assert(std::movable<int (S::*)() volatile&>);
59 static_assert(std::movable<int (S::*)() volatile & noexcept>);
60 static_assert(std::movable<int (S::*)() volatile&&>);
61 static_assert(std::movable<int (S::*)() volatile && noexcept>);
62 static_assert(std::movable<int (S::*)() const volatile>);
63 static_assert(std::movable<int (S::*)() const volatile noexcept>);
64 static_assert(std::movable<int (S::*)() const volatile&>);
65 static_assert(std::movable<int (S::*)() const volatile & noexcept>);
66 static_assert(std::movable<int (S::*)() const volatile&&>);
67 static_assert(std::movable<int (S::*)() const volatile && noexcept>);
68 
69 static_assert(std::movable<std::deque<int> >);
70 static_assert(std::movable<std::forward_list<int> >);
71 static_assert(std::movable<std::list<int> >);
72 static_assert(std::movable<std::optional<std::vector<int> > >);
73 static_assert(std::movable<std::vector<int> >);
74 
75 static_assert(std::movable<traditional_copy_assignment_only>);
76 static_assert(std::movable<has_volatile_member>);
77 static_assert(std::movable<has_array_member>);
78 
79 // Not objects
80 static_assert(!std::movable<int&>);
81 static_assert(!std::movable<int const&>);
82 static_assert(!std::movable<int volatile&>);
83 static_assert(!std::movable<int const volatile&>);
84 static_assert(!std::movable<int&&>);
85 static_assert(!std::movable<int const&&>);
86 static_assert(!std::movable<int volatile&&>);
87 static_assert(!std::movable<int const volatile&&>);
88 static_assert(!std::movable<int()>);
89 static_assert(!std::movable<int (&)()>);
90 static_assert(!std::movable<int[5]>);
91 
92 // Core non-move assignable.
93 static_assert(!std::movable<int const>);
94 static_assert(!std::movable<int const volatile>);
95 
96 static_assert(!std::movable<DeletedMoveCtor>);
97 static_assert(!std::movable<ImplicitlyDeletedMoveCtor>);
98 static_assert(!std::movable<DeletedMoveAssign>);
99 static_assert(!std::movable<ImplicitlyDeletedMoveAssign>);
100 static_assert(!std::movable<NonMovable>);
101 static_assert(!std::movable<DerivedFromNonMovable>);
102 static_assert(!std::movable<HasANonMovable>);
103 
104 static_assert(std::movable<cpp03_friendly>);
105 static_assert(std::movable<const_move_ctor>);
106 static_assert(std::movable<volatile_move_ctor>);
107 static_assert(std::movable<cv_move_ctor>);
108 static_assert(std::movable<multi_param_move_ctor>);
109 static_assert(!std::movable<not_quite_multi_param_move_ctor>);
110 
111 static_assert(!std::assignable_from<copy_assign_with_mutable_parameter&,
112                                     copy_assign_with_mutable_parameter>);
113 static_assert(!std::movable<copy_assign_with_mutable_parameter>);
114 
115 static_assert(!std::movable<const_move_assignment>);
116 static_assert(std::movable<volatile_move_assignment>);
117 static_assert(!std::movable<cv_move_assignment>);
118 
119 static_assert(!std::movable<const_move_assign_and_traditional_move_assign>);
120 static_assert(!std::movable<volatile_move_assign_and_traditional_move_assign>);
121 static_assert(!std::movable<cv_move_assign_and_traditional_move_assign>);
122 static_assert(std::movable<const_move_assign_and_default_ops>);
123 static_assert(std::movable<volatile_move_assign_and_default_ops>);
124 static_assert(std::movable<cv_move_assign_and_default_ops>);
125 
126 static_assert(!std::movable<has_const_member>);
127 static_assert(!std::movable<has_cv_member>);
128 static_assert(!std::movable<has_lvalue_reference_member>);
129 static_assert(!std::movable<has_rvalue_reference_member>);
130 static_assert(!std::movable<has_function_ref_member>);
131 
132 static_assert(std::movable<deleted_assignment_from_const_rvalue>);
133 
134 // `move_constructible and assignable_from<T&, T>` implies `swappable<T>`,
135 // so there's nothing to test for the case of non-swappable.
136 
137 int main(int, char**) { return 0; }
138