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