blob: fa42b0633850b7f8b6d7e306bbe3430ae1af634b [file] [log] [blame]
Saar Raz67c608a2020-01-24 00:43:22 +02001// RUN: %clang_cc1 -std=c++2a -x c++ %s -verify
Saar Raza0f50d72020-01-18 09:11:43 +02002
3bool r1 = requires () {};
4// expected-error@-1 {{a requires expression must contain at least one requirement}}
5
6bool r2 = requires { requires true; };
7
8bool r3 = requires (int a, ...) { requires true; };
9// expected-error@-1 {{varargs not allowed in requires expression}}
10
11template<typename... T>
12bool r4 = requires (T... ts) { requires true; };
13
14bool r5 = requires (bool c, int d) { c; d; };
15
16bool r6 = requires (bool c, int d) { c; d; } && decltype(d){};
17// expected-error@-1 {{use of undeclared identifier 'd'}}
18
19bool 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
23bool r8 = requires (bool, int) { requires true; };
24
25bool 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
29bool r10 = requires (struct new_struct { int x; } s) { requires true; };
30// expected-error@-1 {{'new_struct' cannot be defined in a parameter type}}
31
32bool 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
37bool r12 = requires (int x = 10) { requires true; };
38// expected-error@-1 {{default arguments not allowed for parameters of a requires expression}}
39
40bool r13 = requires (int f(int)) { requires true; };
41
42bool r14 = requires (int (*f)(int)) { requires true; };
43
44bool r15 = requires (10) { requires true; };
45// expected-error@-1 {{expected parameter declarator}}
46
47bool r16 = requires (auto x) { requires true; };
48// expected-error@-1 {{'auto' not allowed in requires expression parameter}}
49
50bool 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
54using a = int;
55
56bool r18 = requires { typename a; };
57
58bool r19 = requires { typename ::a; };
59
60template<typename T> struct identity { using type = T; };
61
62template<typename T> using identity_t = T;
63
64bool r20 = requires {
65 typename identity<int>::type;
66 typename identity<int>;
67 typename ::identity_t<int>;
68};
69
70struct s { bool operator==(const s&); ~s(); };
71
72bool r21 = requires { typename s::operator==; };
73// expected-error@-1 {{expected an identifier or template-id after '::'}}
74
75bool r22 = requires { typename s::~s; };
76// expected-error@-1 {{expected an identifier or template-id after '::'}}
77
78template<typename T>
79bool r23 = requires { typename identity<T>::temp<T>; };
80// expected-error@-1 {{use 'template' keyword to treat 'temp' as a dependent template name}}
81
82template<typename T>
83bool 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
88bool r25 = requires { ; };
89// expected-error@-1 {{expected expression}}
90
91bool r26 = requires { {}; };
92// expected-error@-1 {{expected expression}}
93
94bool r27 = requires { { 0 } noexcept; };
95
96bool 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
100template<typename T>
101concept C1 = true;
102
103template<typename T, typename U>
104concept C2 = true;
105
106bool r29 = requires { { 0 } noexcept C1; };
107// expected-error@-1 {{expected '->' before expression type requirement}}
108
109bool r30 = requires { { 0 } noexcept -> C2<int>; };
110
Saar Raz50439622020-01-26 20:39:44 +0200111namespace ns { template<typename T> concept C = true; }
112
113bool r31 = requires { { 0 } noexcept -> ns::C; };
114
Saar Raza0f50d72020-01-18 09:11:43 +0200115template<typename T>
116T i1 = 0;
117
Saar Raz50439622020-01-26 20:39:44 +0200118bool r32 = requires { requires false, 1; };
Saar Raza0f50d72020-01-18 09:11:43 +0200119// expected-error@-1 {{expected ';' at end of requirement}}
120
Saar Raz50439622020-01-26 20:39:44 +0200121bool r33 = requires { 0 noexcept; };
Saar Raza0f50d72020-01-18 09:11:43 +0200122// expected-error@-1 {{'noexcept' can only be used in a compound requirement (with '{' '}' around the expression)}}
123
Saar Raz50439622020-01-26 20:39:44 +0200124bool r34 = requires { 0 int; };
Saar Raza0f50d72020-01-18 09:11:43 +0200125// expected-error@-1 {{expected ';' at end of requirement}}
126
Saar Raz50439622020-01-26 20:39:44 +0200127bool r35 = requires { requires true };
Saar Raza0f50d72020-01-18 09:11:43 +0200128// expected-error@-1 {{expected ';' at end of requirement}}
129
Saar Raz50439622020-01-26 20:39:44 +0200130bool r36 = requires (bool b) { requires sizeof(b) == 1; };
Saar Raza0f50d72020-01-18 09:11:43 +0200131
Saar Raz50439622020-01-26 20:39:44 +0200132void r37(bool b) requires requires { 1 } {}
Saar Raza0f50d72020-01-18 09:11:43 +0200133// expected-error@-1 {{expected ';' at end of requirement}}
134
Saar Raz50439622020-01-26 20:39:44 +0200135bool r38 = requires { requires { 1; }; };
Saar Raza0f50d72020-01-18 09:11:43 +0200136// 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 Raz50439622020-01-26 20:39:44 +0200138bool r39 = requires { requires () { 1; }; };
Saar Raza0f50d72020-01-18 09:11:43 +0200139// 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 Raz50439622020-01-26 20:39:44 +0200141bool r40 = requires { requires (int i) { i; }; };
Saar Raza0f50d72020-01-18 09:11:43 +0200142// 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 Raz50439622020-01-26 20:39:44 +0200144bool r41 = requires { requires (); };
Saar Raza0f50d72020-01-18 09:11:43 +0200145// expected-error@-1 {{expected expression}}