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 #ifndef TEST_SUPPORT_TYPE_CLASSIFICATION_MOVABLE_H 9 #define TEST_SUPPORT_TYPE_CLASSIFICATION_MOVABLE_H 10 11 struct has_const_member { 12 int const x; 13 }; 14 15 struct has_volatile_member { 16 int volatile x; 17 }; 18 19 struct has_cv_member { 20 int const volatile x; 21 }; 22 23 struct has_lvalue_reference_member { 24 int& x; 25 }; 26 27 struct has_rvalue_reference_member { 28 int&& x; 29 }; 30 31 struct has_array_member { 32 int x[5]; 33 }; 34 35 struct has_function_ref_member { 36 int (&f)(); 37 }; 38 39 struct cpp03_friendly { 40 cpp03_friendly(cpp03_friendly const&); 41 cpp03_friendly& operator=(cpp03_friendly const&); 42 }; 43 44 struct const_move_ctor { 45 const_move_ctor(const_move_ctor const&&); 46 const_move_ctor& operator=(const_move_ctor&&); 47 }; 48 49 struct volatile_move_ctor { 50 volatile_move_ctor(volatile_move_ctor volatile&&); 51 volatile_move_ctor& operator=(volatile_move_ctor&&); 52 }; 53 54 struct cv_move_ctor { 55 cv_move_ctor(cv_move_ctor const volatile&&); 56 cv_move_ctor& operator=(cv_move_ctor&&); 57 }; 58 59 struct multi_param_move_ctor { 60 multi_param_move_ctor(multi_param_move_ctor&&, int = 0); 61 multi_param_move_ctor& operator=(multi_param_move_ctor&&); 62 }; 63 64 struct not_quite_multi_param_move_ctor { 65 not_quite_multi_param_move_ctor(not_quite_multi_param_move_ctor&&, int); 66 not_quite_multi_param_move_ctor& operator=(not_quite_multi_param_move_ctor&&); 67 }; 68 69 struct copy_with_mutable_parameter { 70 copy_with_mutable_parameter(copy_with_mutable_parameter&); 71 copy_with_mutable_parameter& 72 operator=(copy_with_mutable_parameter&); 73 }; 74 75 struct const_move_assignment { 76 const_move_assignment& operator=(const_move_assignment&&) const; 77 }; 78 79 struct volatile_move_assignment { 80 const_move_assignment& operator=(const_move_assignment&&) volatile; 81 }; 82 83 struct cv_move_assignment { 84 cv_move_assignment& operator=(cv_move_assignment&&) const volatile; 85 }; 86 87 struct const_move_assign_and_traditional_move_assign { 88 const_move_assign_and_traditional_move_assign& 89 operator=(const_move_assign_and_traditional_move_assign&&); 90 const_move_assign_and_traditional_move_assign& 91 operator=(const_move_assign_and_traditional_move_assign&&) const; 92 }; 93 94 struct volatile_move_assign_and_traditional_move_assign { 95 volatile_move_assign_and_traditional_move_assign& 96 operator=(volatile_move_assign_and_traditional_move_assign&&); 97 volatile_move_assign_and_traditional_move_assign& 98 operator=(volatile_move_assign_and_traditional_move_assign&&) volatile; 99 }; 100 101 struct cv_move_assign_and_traditional_move_assign { 102 cv_move_assign_and_traditional_move_assign& 103 operator=(cv_move_assign_and_traditional_move_assign&&); 104 cv_move_assign_and_traditional_move_assign& 105 operator=(cv_move_assign_and_traditional_move_assign&&) const volatile; 106 }; 107 108 struct const_move_assign_and_default_ops { 109 const_move_assign_and_default_ops(const_move_assign_and_default_ops const&) = 110 default; 111 const_move_assign_and_default_ops(const_move_assign_and_default_ops&&) = 112 default; 113 const_move_assign_and_default_ops& 114 operator=(const_move_assign_and_default_ops const&) = default; 115 const_move_assign_and_default_ops& 116 operator=(const_move_assign_and_default_ops&&) = default; 117 const_move_assign_and_default_ops& 118 operator=(const_move_assign_and_default_ops&&) const; 119 }; 120 121 struct volatile_move_assign_and_default_ops { 122 volatile_move_assign_and_default_ops( 123 volatile_move_assign_and_default_ops const&) = default; 124 volatile_move_assign_and_default_ops(volatile_move_assign_and_default_ops&&) = 125 default; 126 volatile_move_assign_and_default_ops& 127 operator=(volatile_move_assign_and_default_ops const&) = default; 128 volatile_move_assign_and_default_ops& 129 operator=(volatile_move_assign_and_default_ops&&) = default; 130 volatile_move_assign_and_default_ops& 131 operator=(volatile_move_assign_and_default_ops&&) volatile; 132 }; 133 134 struct cv_move_assign_and_default_ops { 135 cv_move_assign_and_default_ops(cv_move_assign_and_default_ops const&) = 136 default; 137 cv_move_assign_and_default_ops(cv_move_assign_and_default_ops&&) = default; 138 cv_move_assign_and_default_ops& 139 operator=(cv_move_assign_and_default_ops const&) = default; 140 cv_move_assign_and_default_ops& 141 operator=(cv_move_assign_and_default_ops&&) = default; 142 cv_move_assign_and_default_ops& 143 operator=(cv_move_assign_and_default_ops&&) const volatile; 144 }; 145 146 struct deleted_assignment_from_const_rvalue { 147 deleted_assignment_from_const_rvalue( 148 deleted_assignment_from_const_rvalue const&); 149 deleted_assignment_from_const_rvalue(deleted_assignment_from_const_rvalue&&); 150 deleted_assignment_from_const_rvalue& 151 operator=(const deleted_assignment_from_const_rvalue&); 152 deleted_assignment_from_const_rvalue& 153 operator=(deleted_assignment_from_const_rvalue&&); 154 deleted_assignment_from_const_rvalue& 155 operator=(const deleted_assignment_from_const_rvalue&&) = delete; 156 }; 157 158 #endif // TEST_SUPPORT_TYPE_CLASSIFICATION_MOVABLE_H 159