Saar Raz | 67c608a | 2020-01-24 00:43:22 +0200 | [diff] [blame] | 1 | // RUN: %clang_cc1 -std=c++2a -x c++ %s -verify |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 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 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 111 | namespace ns { template<typename T> concept C = true; } |
| 112 | |
| 113 | bool r31 = requires { { 0 } noexcept -> ns::C; }; |
| 114 | |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 115 | template<typename T> |
| 116 | T i1 = 0; |
| 117 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 118 | bool r32 = requires { requires false, 1; }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 119 | // expected-error@-1 {{expected ';' at end of requirement}} |
| 120 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 121 | bool r33 = requires { 0 noexcept; }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 122 | // expected-error@-1 {{'noexcept' can only be used in a compound requirement (with '{' '}' around the expression)}} |
| 123 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 124 | bool r34 = requires { 0 int; }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 125 | // expected-error@-1 {{expected ';' at end of requirement}} |
| 126 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 127 | bool r35 = requires { requires true }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 128 | // expected-error@-1 {{expected ';' at end of requirement}} |
| 129 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 130 | bool r36 = requires (bool b) { requires sizeof(b) == 1; }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 131 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 132 | void r37(bool b) requires requires { 1 } {} |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 133 | // expected-error@-1 {{expected ';' at end of requirement}} |
| 134 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 135 | bool r38 = requires { requires { 1; }; }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 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 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 138 | bool r39 = requires { requires () { 1; }; }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 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 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 141 | bool r40 = requires { requires (int i) { i; }; }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 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 | |
Saar Raz | 5043962 | 2020-01-26 20:39:44 +0200 | [diff] [blame] | 144 | bool r41 = requires { requires (); }; |
Saar Raz | a0f50d7 | 2020-01-18 09:11:43 +0200 | [diff] [blame] | 145 | // expected-error@-1 {{expected expression}} |