167c608a9SSaar Raz // RUN: %clang_cc1 -std=c++2a -x c++ %s -verify 2a0f50d73SSaar Raz 3a0f50d73SSaar Raz static_assert(requires { requires true; }); 4a0f50d73SSaar Raz 5a0f50d73SSaar Raz template<typename T> requires requires { requires false; } // expected-note{{because 'false' evaluated to false}} 6a0f50d73SSaar Raz struct r1 {}; 7a0f50d73SSaar Raz 8a0f50d73SSaar Raz using r1i = r1<int>; // expected-error{{constraints not satisfied for class template 'r1' [with T = int]}} 9a0f50d73SSaar Raz 10a0f50d73SSaar Raz template<typename T> requires requires { requires sizeof(T) == 0; } // expected-note{{because 'sizeof(int) == 0' (4 == 0) evaluated to false}} 11a0f50d73SSaar Raz struct r2 {}; 12a0f50d73SSaar Raz 13a0f50d73SSaar Raz using r2i = r2<int>; // expected-error{{constraints not satisfied for class template 'r2' [with T = int]}} 14a0f50d73SSaar Raz 15a0f50d73SSaar Raz template<typename T> requires requires (T t) { requires sizeof(t) == 0; } // expected-note{{because 'sizeof (t) == 0' (4 == 0) evaluated to false}} 16a0f50d73SSaar Raz struct r3 {}; 17a0f50d73SSaar Raz 18a0f50d73SSaar Raz using r3i = r3<int>; // expected-error{{constraints not satisfied for class template 'r3' [with T = int]}} 19a0f50d73SSaar Raz 20a0f50d73SSaar Raz template<typename T> 21a0f50d73SSaar Raz struct X { 22a0f50d73SSaar Raz template<typename U> requires requires (U u) { requires sizeof(u) == sizeof(T); } // expected-note{{because 'sizeof (u) == sizeof(T)' would be invalid: invalid application of 'sizeof' to an incomplete type 'void'}} 23a0f50d73SSaar Raz struct r4 {}; 24a0f50d73SSaar Raz }; 25a0f50d73SSaar Raz 26a0f50d73SSaar Raz using r4i = X<void>::r4<int>; // expected-error{{constraints not satisfied for class template 'r4' [with U = int]}} 27a0f50d73SSaar Raz 28a0f50d73SSaar Raz // C++ [expr.prim.req.nested] Examples 29a0f50d73SSaar Raz namespace std_example { 30a0f50d73SSaar Raz template<typename U> concept C1 = sizeof(U) == 1; // expected-note{{because 'sizeof(int) == 1' (4 == 1) evaluated to false}} 31a0f50d73SSaar Raz template<typename T> concept D = 32a0f50d73SSaar Raz requires (T t) { 33a0f50d73SSaar Raz requires C1<decltype (+t)>; // expected-note{{because 'decltype(+t)' (aka 'int') does not satisfy 'C1'}} 34a0f50d73SSaar Raz }; 35a0f50d73SSaar Raz operator +std_example::T136a0f50d73SSaar Raz struct T1 { char operator+() { return 'a'; } }; 37a0f50d73SSaar Raz static_assert(D<T1>); 38a0f50d73SSaar Raz template<D T> struct D_check {}; // expected-note{{because 'short' does not satisfy 'D'}} 39a0f50d73SSaar Raz using dc1 = D_check<short>; // expected-error{{constraints not satisfied for class template 'D_check' [with T = short]}} 40a0f50d73SSaar Raz 41a0f50d73SSaar Raz template<typename T> 4273eaf624SSaar Raz concept C2 = requires (T a) { 43a0f50d73SSaar Raz requires sizeof(a) == 4; // OK 4473eaf624SSaar Raz requires a == 0; // expected-note{{because 'a == 0' would be invalid: constraint variable 'a' cannot be used in an evaluated context}} 45a0f50d73SSaar Raz }; 46*76476efdSMuhammad Usman Shahid static_assert(C2<int>); // expected-note{{because 'int' does not satisfy 'C2'}} expected-error{{static assertion failed}} 47a0f50d73SSaar Raz } 48