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 #include "test_macros.h" 26 27 #ifndef TEST_HAS_NO_THREADS 28 # include <mutex> 29 #endif 30 31 #include "type_classification/moveconstructible.h" 32 #include "type_classification/movable.h" 33 34 // Movable types 35 static_assert(std::movable<int>); 36 static_assert(std::movable<int volatile>); 37 static_assert(std::movable<int*>); 38 static_assert(std::movable<int const*>); 39 static_assert(std::movable<int volatile*>); 40 static_assert(std::movable<int const volatile*>); 41 static_assert(std::movable<int (*)()>); 42 43 struct S {}; 44 static_assert(std::movable<S>); 45 static_assert(std::movable<int S::*>); 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::*)() &&>); 51 static_assert(std::movable<int (S::*)() && 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::*)() const&&>); 57 static_assert(std::movable<int (S::*)() const && 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::*)() volatile&&>); 63 static_assert(std::movable<int (S::*)() 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 static_assert(std::movable<int (S::*)() const volatile&&>); 69 static_assert(std::movable<int (S::*)() const volatile && noexcept>); 70 71 static_assert(std::movable<std::deque<int> >); 72 static_assert(std::movable<std::forward_list<int> >); 73 static_assert(std::movable<std::list<int> >); 74 static_assert(std::movable<std::optional<std::vector<int> > >); 75 static_assert(std::movable<std::vector<int> >); 76 77 static_assert(std::movable<traditional_copy_assignment_only>); 78 static_assert(std::movable<has_volatile_member>); 79 static_assert(std::movable<has_array_member>); 80 81 // Not objects 82 static_assert(!std::movable<int&>); 83 static_assert(!std::movable<int const&>); 84 static_assert(!std::movable<int volatile&>); 85 static_assert(!std::movable<int const volatile&>); 86 static_assert(!std::movable<int&&>); 87 static_assert(!std::movable<int const&&>); 88 static_assert(!std::movable<int volatile&&>); 89 static_assert(!std::movable<int const volatile&&>); 90 static_assert(!std::movable<int()>); 91 static_assert(!std::movable<int (&)()>); 92 static_assert(!std::movable<int[5]>); 93 94 // Core non-move assignable. 95 static_assert(!std::movable<int const>); 96 static_assert(!std::movable<int const volatile>); 97 98 static_assert(!std::movable<DeletedMoveCtor>); 99 static_assert(!std::movable<ImplicitlyDeletedMoveCtor>); 100 static_assert(!std::movable<DeletedMoveAssign>); 101 static_assert(!std::movable<ImplicitlyDeletedMoveAssign>); 102 static_assert(!std::movable<NonMovable>); 103 static_assert(!std::movable<DerivedFromNonMovable>); 104 static_assert(!std::movable<HasANonMovable>); 105 106 static_assert(std::movable<cpp03_friendly>); 107 static_assert(std::movable<const_move_ctor>); 108 static_assert(std::movable<volatile_move_ctor>); 109 static_assert(std::movable<cv_move_ctor>); 110 static_assert(std::movable<multi_param_move_ctor>); 111 static_assert(!std::movable<not_quite_multi_param_move_ctor>); 112 113 static_assert(!std::assignable_from<copy_assign_with_mutable_parameter&, 114 copy_assign_with_mutable_parameter>); 115 static_assert(!std::movable<copy_assign_with_mutable_parameter>); 116 117 static_assert(!std::movable<const_move_assignment>); 118 static_assert(std::movable<volatile_move_assignment>); 119 static_assert(!std::movable<cv_move_assignment>); 120 121 static_assert(!std::movable<const_move_assign_and_traditional_move_assign>); 122 static_assert(!std::movable<volatile_move_assign_and_traditional_move_assign>); 123 static_assert(!std::movable<cv_move_assign_and_traditional_move_assign>); 124 static_assert(std::movable<const_move_assign_and_default_ops>); 125 static_assert(std::movable<volatile_move_assign_and_default_ops>); 126 static_assert(std::movable<cv_move_assign_and_default_ops>); 127 128 static_assert(!std::movable<has_const_member>); 129 static_assert(!std::movable<has_cv_member>); 130 static_assert(!std::movable<has_lvalue_reference_member>); 131 static_assert(!std::movable<has_rvalue_reference_member>); 132 static_assert(!std::movable<has_function_ref_member>); 133 134 static_assert(std::movable<deleted_assignment_from_const_rvalue>); 135 136 // `move_constructible and assignable_from<T&, T>` implies `swappable<T>`, 137 // so there's nothing to test for the case of non-swappable. 138 139 int main(int, char**) { return 0; } 140