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