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