1 // { dg-do compile { target c++17 } } 2 // { dg-options "-fconcepts" } 3 4 template<typename T> Nothrow_assignable()5 concept bool Nothrow_assignable() { return __has_nothrow_assign(T); } 6 7 template<typename T> Nothrow_constructible()8 concept bool Nothrow_constructible() { return __has_nothrow_constructor(T); } 9 10 template<typename T> Nothrow_copyable()11 concept bool Nothrow_copyable() { return __has_nothrow_copy(T); } 12 13 template<typename T> Trivially_assignable()14 concept bool Trivially_assignable() { return __has_trivial_assign(T); } 15 16 template<typename T> Trivially_constructible()17 concept bool Trivially_constructible() { return __has_trivial_constructor(T); } 18 19 template<typename T> Trivially_copyable()20 concept bool Trivially_copyable() { return __has_trivial_copy(T); } 21 22 template<typename T> Trivially_destructible()23 concept bool Trivially_destructible() { return __has_trivial_destructor(T); } 24 25 template<typename T> Dynamically_destructible()26 concept bool Dynamically_destructible() { return __has_virtual_destructor(T); } 27 28 template<typename T> Abstract()29 concept bool Abstract() { return __is_abstract(T); } 30 31 template<typename T> Polymorphic()32 concept bool Polymorphic() { return __is_polymorphic(T); } 33 34 template<typename T> Class()35 concept bool Class() { return __is_class(T); } 36 37 template<typename T> Empty()38 concept bool Empty() { return __is_empty(T); } 39 40 template<typename T> Enum()41 concept bool Enum() { return __is_enum(T); } 42 43 template<typename T> Final()44 concept bool Final() { return __is_final(T); } 45 46 template<typename T> Literal_type()47 concept bool Literal_type() { return __is_literal_type(T); } 48 49 template<typename T> Pod()50 concept bool Pod() { return __is_pod(T); } 51 52 template<typename T> Standard_layout()53 concept bool Standard_layout() { return __is_standard_layout(T); } 54 55 template<typename T> Trivial()56 concept bool Trivial() { return __is_trivial(T); } 57 58 template<typename T> Union()59 concept bool Union() { return __is_union(T); } 60 61 template<Nothrow_assignable T> void f1(); 62 template<Nothrow_copyable T> void f2(); 63 template<Nothrow_constructible T> void f3(); 64 template<Trivially_assignable T> void f4(); 65 template<Trivially_copyable T> void f5(); 66 template<Trivially_constructible T> void f6(); 67 template<Trivially_destructible T> void f7(); 68 template<Dynamically_destructible T> void f8(); 69 template<Class T> void f9(); 70 template<Empty T> void f10(); 71 template<Standard_layout T> void f11(); 72 template<Pod T> void f12(); 73 template<Trivial T> void f13(); 74 template<Polymorphic T> void f14(); 75 template<Abstract T> void f15(); 76 template<Final T> void f16(); 77 template<Union T> void f17(); 78 template<Enum T> void f18(); 79 80 main()81int main() { 82 f1<void>(); // { dg-error "cannot call" } 83 f2<void>(); // { dg-error "cannot call" } 84 f3<void>(); // { dg-error "cannot call" } 85 f4<void>(); // { dg-error "cannot call" } 86 f5<void>(); // { dg-error "cannot call" } 87 f6<void>(); // { dg-error "cannot call" } 88 f7<void>(); // { dg-error "cannot call" } 89 f8<void>(); // { dg-error "cannot call" } 90 f9<void>(); // { dg-error "cannot call" } 91 f10<void>(); // { dg-error "cannot call" } 92 f11<void>(); // { dg-error "cannot call" } 93 f12<void>(); // { dg-error "cannot call" } 94 f13<void>(); // { dg-error "cannot call" } 95 f14<void>(); // { dg-error "cannot call" } 96 f15<void>(); // { dg-error "cannot call" } 97 f16<void>(); // { dg-error "cannot call" } 98 f17<void>(); // { dg-error "cannot call" } 99 } 100