1 // RUN: %clang_cc1 -std=c++2a -x c++ %s -verify 2 3 bool r1 = requires () {}; 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 47 bool r16 = requires (auto x) { requires true; }; 48 // expected-error@-1 {{'auto' not allowed in requires expression parameter}} 49 50 bool r17 = requires (auto [x, y]) { requires true; }; 51 // expected-error@-1 {{'auto' not allowed in requires expression parameter}} 52 // expected-error@-2 {{use of undeclared identifier 'x'}} 53 54 using a = int; 55 56 bool r18 = requires { typename a; }; 57 58 bool r19 = requires { typename ::a; }; 59 60 template<typename T> struct identity { using type = T; }; 61 62 template<typename T> using identity_t = T; 63 64 bool r20 = requires { 65 typename identity<int>::type; 66 typename identity<int>; 67 typename ::identity_t<int>; 68 }; 69 70 struct s { bool operator==(const s&); ~s(); }; 71 72 bool r21 = requires { typename s::operator==; }; 73 // expected-error@-1 {{expected an identifier or template-id after '::'}} 74 75 bool r22 = requires { typename s::~s; }; 76 // expected-error@-1 {{expected an identifier or template-id after '::'}} 77 78 template<typename T> 79 bool r23 = requires { typename identity<T>::temp<T>; }; 80 // expected-error@-1 {{use 'template' keyword to treat 'temp' as a dependent template name}} 81 82 template<typename T> 83 bool r24 = requires { 84 typename identity<T>::template temp<T>; 85 typename identity<T>::template temp; // expected-error{{expected an identifier or template-id after '::'}} 86 }; 87 88 bool r25 = requires { ; }; 89 // expected-error@-1 {{expected expression}} 90 91 bool r26 = requires { {}; }; 92 // expected-error@-1 {{expected expression}} 93 94 bool r27 = requires { { 0 } noexcept; }; 95 96 bool r28 = requires { { 0 } noexcept noexcept; }; 97 // expected-error@-1 {{expected '->' before expression type requirement}} 98 // expected-error@-2 {{expected concept name with optional arguments}} 99 100 template<typename T> 101 concept C1 = true; 102 103 template<typename T, typename U> 104 concept C2 = true; 105 106 bool r29 = requires { { 0 } noexcept C1; }; 107 // expected-error@-1 {{expected '->' before expression type requirement}} 108 109 bool r30 = requires { { 0 } noexcept -> C2<int>; }; 110 111 namespace ns { template<typename T> concept C = true; } 112 113 bool r31 = requires { { 0 } noexcept -> ns::C; }; 114 115 template<typename T> 116 T i1 = 0; 117 118 bool r32 = requires { requires false, 1; }; 119 // expected-error@-1 {{expected ';' at end of requirement}} 120 121 bool r33 = requires { 0 noexcept; }; 122 // expected-error@-1 {{'noexcept' can only be used in a compound requirement (with '{' '}' around the expression)}} 123 124 bool r34 = requires { 0 int; }; 125 // expected-error@-1 {{expected ';' at end of requirement}} 126 127 bool r35 = requires { requires true }; 128 // expected-error@-1 {{expected ';' at end of requirement}} 129 130 bool r36 = requires (bool b) { requires sizeof(b) == 1; }; 131 132 void r37(bool b) requires requires { 1 } {} 133 // expected-error@-1 {{expected ';' at end of requirement}} 134 135 bool r38 = requires { requires { 1; }; }; 136 // 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)}} 137 138 bool r39 = requires { requires () { 1; }; }; 139 // 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)}} 140 141 bool r40 = requires { requires (int i) { i; }; }; 142 // 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)}} 143 144 bool r41 = requires { requires (); }; 145 // expected-error@-1 {{expected expression}} 146