1 // { dg-options "-std=c++1z -fconcepts" }
2 
3 // Performance test... This should be fast.
4 
5 #include <type_traits>
6 
7 template<typename T>
Destructible()8 concept bool Destructible() {
9     return std::is_destructible<T>::value;
10 }
11 template<typename T, typename... Args>
Constructible()12 concept bool Constructible() {
13     return Destructible<T>() && std::is_constructible<T, Args...>::value;
14 }
15 template<typename T>
Move_constructible()16 concept bool Move_constructible() {
17     return Constructible<T, T&&>();
18 }
19 template<typename T>
Copy_constructible()20 concept bool Copy_constructible() {
21     return Move_constructible<T>() && Constructible<T, const T&>();
22 }
23 template<typename T, typename U>
Assignable()24 concept bool Assignable() {
25     return std::is_assignable<T, U>::value;
26 }
27 template<typename T>
Move_assignable()28 concept bool Move_assignable() {
29     return Assignable<T&, T&&>();
30 }
31 template<typename T>
Copy_assignable()32 concept bool Copy_assignable() {
33     return Move_assignable<T>() && Assignable<T&, const T&>();
34 }
35 template<typename T>
Copyable()36 concept bool Copyable() {
37     return Copy_constructible<T>() && Copy_assignable<T>();
38 }
39 
40 template<typename T>
C1()41 concept bool C1() { return Copyable<T>(); }
42 template<typename T>
C2()43 concept bool C2() { return C1<T>(); }
44 template<typename T>
C3()45 concept bool C3() { return C2<T>(); }
46 template<typename T>
C4()47 concept bool C4() { return C3<T>(); }
48 template<typename T>
C5()49 concept bool C5() { return C4<T>(); }
50 template<typename T>
C6()51 concept bool C6() { return C5<T>(); }
52 template<typename T>
C7()53 concept bool C7() { return C6<T>(); }
54 template<typename T>
C8()55 concept bool C8() { return C7<T>(); }
56 template<typename T>
C9()57 concept bool C9() { return C8<T>(); }
58 template<typename T>
C10()59 concept bool C10() { return C9<T>(); }
60 template<typename T>
C11()61 concept bool C11() { return C10<T>(); }
62 
63 struct S1 {};
64 struct S2 {};
65 struct S3 {};
66 struct S4 {};
67 struct S5 {};
68 struct S6 {};
69 
70 static_assert(C11<S1>(), "");
71 static_assert(C11<S2>(), "");
72 static_assert(C11<S3>(), "");
73 static_assert(C11<S4>(), "");
74 static_assert(C11<S5>(), "");
75 static_assert(C11<S6>(), "");
76