83 lines · cpp
1// RUN: %clang_cc1 -std=c++2a -x c++ %s -verify2 3using A = int;4 5template<typename T, typename U>6constexpr bool is_same_v = false;7 8template<typename T>9constexpr bool is_same_v<T, T> = true;10 11template<typename T, typename U>12concept same_as = is_same_v<T, U>;13 14static_assert(requires { requires true; 0; typename A;15 { 0 } -> same_as<int>; });16static_assert(is_same_v<bool, decltype(requires { requires false; })>);17 18// Check that requires expr is an unevaluated context.19struct Y {20 int i;21 static constexpr bool r = requires { i; };22};23 24template<typename T> requires requires (T t) {25 requires false; // expected-note{{because 'false' evaluated to false}}26 requires false;27 requires requires {28 requires false;29 };30}31struct r1 { };32 33using r1i = r1<int>;34// expected-error@-1 {{constraints not satisfied for class template 'r1' [with T = int]}}35 36template<typename T> requires requires (T t) {37 requires requires {38 requires false; // expected-note{{because 'false' evaluated to false}}39 };40}41struct r2 { };42 43using r2i = r2<int>;44// expected-error@-1 {{constraints not satisfied for class template 'r2' [with T = int]}}45 46template<typename T> requires requires (T t) {47 requires requires {48 requires true;49 };50 requires true;51 requires requires {52 requires false; // expected-note{{because 'false' evaluated to false}}53 };54}55struct r3 { };56 57using r3i = r3<int>;58// expected-error@-1 {{constraints not satisfied for class template 'r3' [with T = int]}}59 60template<typename T>61struct S { static const int s = T::value; };62 63template<typename T> requires requires { T::value; S<T>::s; }64// expected-note@-1 {{because 'T::value' would be invalid: type 'int' cannot be used prior to '::' because it has no members}}65struct r4 { };66 67using r4i = r4<int>;68// expected-error@-1 {{constraints not satisfied for class template 'r4' [with T = int]}}69 70namespace GH109538 {71static_assert(requires(void *t) { t; });72static_assert(requires(void) { 42; });73static_assert(requires(void t) { // expected-error {{argument may not have 'void' type}}74 t;75});76static_assert(requires(void t, int a) { // expected-error {{'void' must be the first and only parameter if specified}}77 t;78});79static_assert(requires(const void) { // expected-error {{'void' as parameter must not have type qualifiers}}80 42;81});82} // namespace GH10953883