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