1 // RUN: %clang_cc1 -std=c++2a -verify %s
2
3 template<typename T, typename U>
4 constexpr bool is_same_v = false;
5
6 template<typename T>
7 constexpr bool is_same_v<T, T> = true;
8
9 void f1(int a) requires true; // OK
10 auto f2(int a) -> bool requires true; // OK
11 auto f3(int a) -> bool (*)(int b) requires true; // OK
12 auto f4(int a) requires true -> bool; // expected-error{{trailing return type must appear before trailing requires clause}}
13 int f5(int a) requires; // expected-error{{expected expression}}
f6(int a)14 int f6(int a) requires {} // expected-error{{expected expression}}
15 void (f7()) requires true;
16 void (f8() requires true); // expected-error{{trailing requires clause should be placed outside parentheses}}
17 void (*(f9 requires (true)))(); // expected-error{{trailing requires clause should be placed outside parentheses}}
18 static_assert(is_same_v<decltype(f9), void (*)()>);
19 void (*pf)() requires true; // expected-error{{trailing requires clause can only be used when declaring a function}}
20 void g1(int (*dsdads)() requires false); // expected-error{{trailing requires clause can only be used when declaring a function}}
21 void g2(int (*(*dsdads)())() requires true); // expected-error{{trailing requires clause can only be used when declaring a function}}
22 void g3(int (*(*dsdads)(int) requires true)() ); // expected-error{{trailing requires clause should be placed outside parentheses}}
23 using T = void ();
24 T x requires true;
25 struct S {
26 T m1 requires true, m2 requires true;
27 };
28
29 template<typename T>
30 struct R {
31 R(T t);
32 };
33
34 template<typename T>
35 R(T) -> R<T> requires true; // expected-error{{deduction guide cannot have a requires clause}}
36