111
|
1 // PR c++/66962
|
131
|
2 // { dg-do compile { target c++17 } }
|
|
3 // { dg-options "-fconcepts" }
|
111
|
4
|
|
5 template <typename> struct remove_cv;
|
|
6 template <typename> struct is_reference;
|
|
7 template <typename> void declval();
|
|
8 template <typename> struct is_constructible;
|
|
9 template <typename> struct is_nothrow_constructible;
|
|
10 template <typename _Tp> using remove_cv_t = typename remove_cv<_Tp>::type;
|
|
11 template <typename> struct Trans_NS_extension_apply_list;
|
|
12 template <typename T> using _t = typename T::type;
|
|
13 template <class> void ImplicitlyConvertibleTo();
|
|
14 template <class> void Assignable();
|
|
15 template <class T, class... Args> int ConstructibleObject = requires { T{}; };
|
|
16 template <class T, class... Args>
|
|
17 concept bool BindableReference =
|
|
18 is_reference<T>::value &&is_constructible<T>::value;
|
|
19 template <class T, class... Args> concept bool Constructible() {
|
|
20 return ConstructibleObject<T> || BindableReference<T, Args...>;
|
|
21 }
|
|
22 template <class T> concept bool DefaultConstructible() {
|
|
23 return Constructible<T>() && requires { new T[0]; };
|
|
24 }
|
|
25 template <class T> concept bool MoveConstructible() {
|
|
26 return Constructible<T>() && ImplicitlyConvertibleTo<T>;
|
|
27 }
|
|
28 template <class T> concept bool Movable() {
|
|
29 return MoveConstructible<T>() && Assignable<T &&>;
|
|
30 }
|
|
31 template <class, class> int Swappable_ = requires { 0; };
|
|
32 template <class T, class U> int Swappable();
|
|
33 template <class T> concept bool Dereferencable = requires{{0}};
|
|
34 template <Dereferencable R> using RvalueReferenceType = decltype(0);
|
|
35 template <class T> int IsValueType;
|
|
36 template <class> struct value_type;
|
|
37 template <class T>
|
|
38 requires IsValueType<
|
|
39 _t<value_type<remove_cv_t<T>>>> using ValueType =
|
|
40 _t<value_type<remove_cv_t<T>>>;
|
|
41 template <class I> concept bool Readable() {
|
|
42 return Movable<I>() && DefaultConstructible<I>() &&
|
|
43 Dereferencable<const I> && requires{{0}};
|
|
44 }
|
|
45 template <class Out, class T> concept bool MoveWritable() {
|
|
46 return Movable<Out>() && DefaultConstructible<Out>() &&
|
|
47 Dereferencable<Out>;
|
|
48 }
|
|
49 template <class In, class Out> concept bool IndirectlyMovable() {
|
|
50 return Readable<In>() && Movable<ValueType<In>>() &&
|
|
51 Constructible<ValueType<In>>() &&
|
|
52 MoveWritable<Out, RvalueReferenceType<In>>() &&
|
|
53 MoveWritable<Out, ValueType<In>>();
|
|
54 }
|
|
55 IndirectlyMovable { In, Out }
|
|
56 int is_nothrow_indirectly_movable_v =
|
|
57 is_nothrow_constructible<ValueType<In>>::value;
|
|
58 template <Readable R1, Readable R2>
|
|
59 requires IndirectlyMovable<R1, R2>() &&
|
|
60 IndirectlyMovable<R2, R1>() void iter_swap2();
|