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