Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/concepts/disjunction1.C @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
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(); |