xref: /llvm-project/libcxx/test/support/type_classification/movable.h (revision 480cd780d63fd9c658cc2f51d0c54416b8b1a5c3)
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