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();