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 
11 // template<class T>
12 // concept copy_constructible;
13 
14 #include <concepts>
15 #include <type_traits>
16 
17 #include "type_classification/moveconstructible.h"
18 
19 // Tests in this namespace are shared with moveconstructible.pass.cpp
20 // There are some interesting differences, so it's best if they're tested here
21 // too.
22 namespace MoveConstructibleTests {
23 static_assert(std::copy_constructible<int>);
24 static_assert(std::copy_constructible<int*>);
25 static_assert(std::copy_constructible<int&>);
26 static_assert(std::copy_constructible<const int>);
27 static_assert(std::copy_constructible<const int&>);
28 static_assert(std::copy_constructible<volatile int>);
29 static_assert(std::copy_constructible<volatile int&>);
30 static_assert(std::copy_constructible<int (*)()>);
31 static_assert(std::copy_constructible<int (&)()>);
32 static_assert(std::copy_constructible<HasDefaultOps>);
33 static_assert(std::copy_constructible<const CustomMoveCtor&>);
34 static_assert(std::copy_constructible<volatile CustomMoveCtor&>);
35 static_assert(std::copy_constructible<const CustomMoveAssign&>);
36 static_assert(std::copy_constructible<volatile CustomMoveAssign&>);
37 static_assert(std::copy_constructible<int HasDefaultOps::*>);
38 static_assert(std::copy_constructible<void (HasDefaultOps::*)(int)>);
39 static_assert(std::copy_constructible<MemberLvalueReference>);
40 
41 static_assert(!std::copy_constructible<void>);
42 static_assert(!std::copy_constructible<CustomMoveAssign>);
43 static_assert(!std::copy_constructible<const CustomMoveCtor>);
44 static_assert(!std::copy_constructible<volatile CustomMoveCtor>);
45 static_assert(!std::copy_constructible<const CustomMoveAssign>);
46 static_assert(!std::copy_constructible<volatile CustomMoveAssign>);
47 static_assert(!std::copy_constructible<int[10]>);
48 static_assert(!std::copy_constructible<DeletedMoveCtor>);
49 static_assert(!std::copy_constructible<ImplicitlyDeletedMoveCtor>);
50 static_assert(!std::copy_constructible<DeletedMoveAssign>);
51 static_assert(!std::copy_constructible<ImplicitlyDeletedMoveAssign>);
52 
53 static_assert(std::copy_constructible<DeletedMoveCtor&>);
54 static_assert(std::copy_constructible<const DeletedMoveCtor&>);
55 static_assert(std::copy_constructible<ImplicitlyDeletedMoveCtor&>);
56 static_assert(std::copy_constructible<const ImplicitlyDeletedMoveCtor&>);
57 static_assert(std::copy_constructible<DeletedMoveAssign&>);
58 static_assert(std::copy_constructible<const DeletedMoveAssign&>);
59 static_assert(std::copy_constructible<ImplicitlyDeletedMoveAssign&>);
60 static_assert(std::copy_constructible<const ImplicitlyDeletedMoveAssign&>);
61 
62 // different to moveconstructible.pass.cpp
63 static_assert(!std::copy_constructible<int&&>);
64 static_assert(!std::copy_constructible<const int&&>);
65 static_assert(!std::copy_constructible<volatile int&&>);
66 static_assert(!std::copy_constructible<CustomMoveCtor>);
67 static_assert(!std::copy_constructible<MoveOnly>);
68 static_assert(!std::copy_constructible<const CustomMoveCtor&&>);
69 static_assert(!std::copy_constructible<volatile CustomMoveCtor&&>);
70 static_assert(!std::copy_constructible<const CustomMoveAssign&&>);
71 static_assert(!std::copy_constructible<volatile CustomMoveAssign&&>);
72 static_assert(!std::copy_constructible<DeletedMoveCtor&&>);
73 static_assert(!std::copy_constructible<const DeletedMoveCtor&&>);
74 static_assert(!std::copy_constructible<ImplicitlyDeletedMoveCtor&&>);
75 static_assert(!std::copy_constructible<const ImplicitlyDeletedMoveCtor&&>);
76 static_assert(!std::copy_constructible<DeletedMoveAssign&&>);
77 static_assert(!std::copy_constructible<const DeletedMoveAssign&&>);
78 static_assert(!std::copy_constructible<ImplicitlyDeletedMoveAssign&&>);
79 static_assert(!std::copy_constructible<const ImplicitlyDeletedMoveAssign&&>);
80 static_assert(!std::copy_constructible<MemberRvalueReference>);
81 } // namespace MoveConstructibleTests
82 
83 namespace CopyConstructibleTests {
84 struct CopyCtorUserDefined {
85   CopyCtorUserDefined(CopyCtorUserDefined&&) noexcept = default;
86   CopyCtorUserDefined(const CopyCtorUserDefined&);
87 };
88 static_assert(std::copy_constructible<CopyCtorUserDefined>);
89 
90 struct CopyAssignUserDefined {
91   CopyAssignUserDefined& operator=(CopyAssignUserDefined&&) noexcept = default;
92   CopyAssignUserDefined& operator=(const CopyAssignUserDefined&);
93 };
94 static_assert(!std::copy_constructible<CopyAssignUserDefined>);
95 
96 struct CopyCtorAndAssignUserDefined {
97   CopyCtorAndAssignUserDefined(CopyCtorAndAssignUserDefined&&) noexcept =
98       default;
99   CopyCtorAndAssignUserDefined(const CopyCtorAndAssignUserDefined&);
100   CopyCtorAndAssignUserDefined&
101   operator=(CopyCtorAndAssignUserDefined&&) noexcept = default;
102   CopyCtorAndAssignUserDefined& operator=(const CopyCtorAndAssignUserDefined&);
103 };
104 static_assert(std::copy_constructible<CopyCtorAndAssignUserDefined>);
105 
106 struct CopyCtorDeleted {
107   CopyCtorDeleted(CopyCtorDeleted&&) noexcept = default;
108   CopyCtorDeleted(const CopyCtorDeleted&) = delete;
109 };
110 static_assert(!std::copy_constructible<CopyCtorDeleted>);
111 
112 struct CopyAssignDeleted {
113   CopyAssignDeleted(CopyAssignDeleted&&) noexcept = default;
114   CopyAssignDeleted(const CopyAssignDeleted&) = delete;
115 };
116 static_assert(!std::copy_constructible<CopyAssignDeleted>);
117 
118 struct CopyCtorHasMutableRef {
119   CopyCtorHasMutableRef(CopyCtorHasMutableRef&&) noexcept = default;
120   CopyCtorHasMutableRef(CopyCtorHasMutableRef&) = default;
121 };
122 static_assert(!std::copy_constructible<CopyCtorHasMutableRef>);
123 
124 struct CopyCtorProhibitsMutableRef {
125   CopyCtorProhibitsMutableRef(CopyCtorProhibitsMutableRef&&) noexcept = default;
126   CopyCtorProhibitsMutableRef(const CopyCtorProhibitsMutableRef&) = default;
127   CopyCtorProhibitsMutableRef(CopyCtorProhibitsMutableRef&) = delete;
128 };
129 static_assert(!std::copy_constructible<CopyCtorProhibitsMutableRef>);
130 
131 struct CopyAssignHasMutableRef {
132   CopyAssignHasMutableRef&
133   operator=(CopyAssignHasMutableRef&&) noexcept = default;
134   CopyAssignHasMutableRef& operator=(CopyAssignHasMutableRef&) = default;
135 };
136 static_assert(!std::copy_constructible<CopyAssignHasMutableRef>);
137 
138 struct CopyAssignProhibitsMutableRef {
139   CopyAssignProhibitsMutableRef&
140   operator=(CopyAssignProhibitsMutableRef&&) noexcept = default;
141   CopyAssignProhibitsMutableRef&
142   operator=(const CopyAssignProhibitsMutableRef&) = default;
143   CopyAssignProhibitsMutableRef&
144   operator=(CopyAssignProhibitsMutableRef&) = delete;
145 };
146 static_assert(!std::copy_constructible<CopyAssignProhibitsMutableRef>);
147 
148 struct CopyCtorOnly {
149   CopyCtorOnly(CopyCtorOnly&&) noexcept = delete;
150   CopyCtorOnly(const CopyCtorOnly&) = default;
151 };
152 static_assert(!std::copy_constructible<CopyCtorOnly>);
153 
154 struct CopyAssignOnly {
155   CopyAssignOnly& operator=(CopyAssignOnly&&) noexcept = delete;
156   CopyAssignOnly& operator=(const CopyAssignOnly&) = default;
157 };
158 static_assert(!std::copy_constructible<CopyAssignOnly>);
159 
160 struct CopyOnly {
161   CopyOnly(CopyOnly&&) noexcept = delete;
162   CopyOnly(const CopyOnly&) = default;
163 
164   CopyOnly& operator=(CopyOnly&&) noexcept = delete;
165   CopyOnly& operator=(const CopyOnly&) = default;
166 };
167 static_assert(!std::copy_constructible<CopyOnly>);
168 
169 struct ExplicitlyCopyable {
170   ExplicitlyCopyable(ExplicitlyCopyable&&) = default;
171   explicit ExplicitlyCopyable(const ExplicitlyCopyable&);
172 };
173 static_assert(!std::copy_constructible<ExplicitlyCopyable>);
174 } // namespace CopyConstructibleTests
175