brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 09f8f36 Raw
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