1 // RUN: %clang_cc1 -std=c++2a -x c++ %s -verify 2 3 bool r1 = requires () {}; f(int z)4// expected-error@-1 {{a requires expression must contain at least one requirement}} 5 6 bool r2 = requires { requires true; }; 7 8 bool r3 = requires (int a, ...) { requires true; }; 9 // expected-error@-1 {{varargs not allowed in requires expression}} 10 11 template<typename... T> 12 bool r4 = requires (T... ts) { requires true; }; 13 14 bool r5 = requires (bool c, int d) { c; d; }; 15 16 bool r6 = requires (bool c, int d) { c; d; } && decltype(d){}; 17 // expected-error@-1 {{use of undeclared identifier 'd'}} 18 19 bool r7 = requires (bool c) { c; (requires (int d) { c; d; }); d; } && decltype(c){} && decltype(d){}; 20 // expected-error@-1 2{{use of undeclared identifier 'd'}} 21 // expected-error@-2 {{use of undeclared identifier 'c'}} 22 23 bool r8 = requires (bool, int) { requires true; }; 24 25 bool r9 = requires (bool a, int a) { requires true; }; 26 // expected-error@-1 {{redefinition of parameter 'a'}} 27 // expected-note@-2 {{previous declaration is here}} 28 29 bool r10 = requires (struct new_struct { int x; } s) { requires true; }; 30 // expected-error@-1 {{'new_struct' cannot be defined in a parameter type}} 31 32 bool r11 = requires (int x(1)) { requires true; }; 33 // expected-error@-1 {{expected parameter declarator}} 34 // expected-error@-2 {{expected ')'}} 35 // expected-note@-3 {{to match this '('}} 36 37 bool r12 = requires (int x = 10) { requires true; }; 38 // expected-error@-1 {{default arguments not allowed for parameters of a requires expression}} 39 40 bool r13 = requires (int f(int)) { requires true; }; 41 42 bool r14 = requires (int (*f)(int)) { requires true; }; 43 44 bool r15 = requires (10) { requires true; }; 45 // expected-error@-1 {{expected parameter declarator}} 46 // expected-error@-2 {{expected ')'}} expected-note@-2 {{to match}} 47 48 bool r16 = requires (auto x) { requires true; }; 49 // expected-error@-1 {{'auto' not allowed in requires expression parameter}} 50 51 bool r17 = requires (auto [x, y]) { requires true; }; 52 // expected-error@-1 {{'auto' not allowed in requires expression parameter}} 53 // expected-error@-2 {{use of undeclared identifier 'x'}} 54 55 using a = int; 56 57 bool r18 = requires { typename a; }; 58 59 bool r19 = requires { typename ::a; }; 60 61 template<typename T> struct identity { using type = T; }; 62 63 template<typename T> using identity_t = T; 64 65 bool r20 = requires { 66 typename identity<int>::type; 67 typename identity<int>; 68 typename ::identity_t<int>; 69 }; 70 71 struct s { bool operator==(const s&); ~s(); }; 72 73 bool r21 = requires { typename s::operator==; }; 74 // expected-error@-1 {{expected an identifier or template-id after '::'}} 75 76 bool r22 = requires { typename s::~s; }; 77 // expected-error@-1 {{expected an identifier or template-id after '::'}} 78 79 template<typename T> 80 bool r23 = requires { typename identity<T>::temp<T>; }; 81 // expected-error@-1 {{use 'template' keyword to treat 'temp' as a dependent template name}} 82 83 template<typename T> 84 bool r24 = requires { 85 typename identity<T>::template temp<T>; 86 typename identity<T>::template temp; // expected-error{{expected an identifier or template-id after '::'}} 87 }; 88 89 bool r25 = requires { ; }; 90 // expected-error@-1 {{expected expression}} 91 92 bool r26 = requires { {}; }; 93 // expected-error@-1 {{expected expression}} 94 95 bool r27 = requires { { 0 } noexcept; }; 96 97 bool r28 = requires { { 0 } noexcept noexcept; }; 98 // expected-error@-1 {{expected '->' before expression type requirement}} 99 // expected-error@-2 {{expected concept name with optional arguments}} 100 101 template<typename T> 102 concept C1 = true; 103 104 template<typename T, typename U> 105 concept C2 = true; 106 107 bool r29 = requires { { 0 } noexcept C1; }; 108 // expected-error@-1 {{expected '->' before expression type requirement}} 109 110 bool r30 = requires { { 0 } noexcept -> C2<int>; }; 111 112 namespace ns { template<typename T> concept C = true; } 113 114 bool r31 = requires { { 0 } noexcept -> ns::C; }; 115 116 template<typename T> 117 T i1 = 0; 118 119 bool r32 = requires { requires false, 1; }; 120 // expected-error@-1 {{expected ';' at end of requirement}} 121 122 bool r33 = requires { 0 noexcept; }; 123 // expected-error@-1 {{'noexcept' can only be used in a compound requirement (with '{' '}' around the expression)}} 124 125 bool r34 = requires { 0 int; }; 126 // expected-error@-1 {{expected ';' at end of requirement}} 127 128 bool r35 = requires { requires true }; 129 // expected-error@-1 {{expected ';' at end of requirement}} 130 131 bool r36 = requires (bool b) { requires sizeof(b) == 1; }; 132 133 void r37(bool b) requires requires { 1 } {} 134 // expected-error@-1 {{expected ';' at end of requirement}} 135 136 bool r38 = requires { requires { 1; }; }; 137 // expected-warning@-1 {{this requires expression will only be checked for syntactic validity; did you intend to place it in a nested requirement? (add another 'requires' before the expression)}} 138 139 bool r39 = requires { requires () { 1; }; }; 140 // expected-warning@-1 {{this requires expression will only be checked for syntactic validity; did you intend to place it in a nested requirement? (add another 'requires' before the expression)}} 141 142 bool r40 = requires { requires (int i) { i; }; }; 143 // expected-warning@-1 {{this requires expression will only be checked for syntactic validity; did you intend to place it in a nested requirement? (add another 'requires' before the expression)}} 144 145 bool r41 = requires { requires (); }; 146 // expected-error@-1 {{expected expression}} 147