64 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s2 3// expected-error@+2 {{non-templated function cannot have a requires clause}}4void f1(int a)5 requires true;6template <typename T>7auto f2(T a) -> bool8 requires true; // OK9 10// expected-error@+4 {{trailing return type must appear before trailing requires clause}}11template <typename T>12auto f3(T a)13 requires true14-> bool;15 16// expected-error@+2{{trailing requires clause can only be used when declaring a function}}17void (*pf)()18 requires true;19 20// expected-error@+1{{trailing requires clause can only be used when declaring a function}}21void g(int (*)() requires true);22 23// expected-error@+1{{expected expression}}24auto *p = new void(*)(char)25 requires true;26 27namespace GH61748 {28template<typename T>29struct S {30 // expected-error@+1 {{non-template friend declaration with a requires clause must be a definition}}31 friend void declared_friend() requires(sizeof(T) > 1);32 // OK, is a definition.33 friend void defined_friend() requires(sizeof(T) > 1){}34 // OK, is a member.35 void member() requires(sizeof(T) > 1);36};37 38template<typename T>39void ContainingFunction() {40 // expected-error@+1 {{non-templated function cannot have a requires clause}}41 void bad() requires(sizeof(T) > 1);42 // expected-error@+1 {{function definition is not allowed here}}43 void still_bad() requires(sizeof(T) > 1) {}44 45}46 47void NonTemplContainingFunction() {48 // expected-error@+1 {{non-templated function cannot have a requires clause}}49 (void)[]() requires (sizeof(int)>1){};50 // OK, a template.51 auto X = [](auto) requires (sizeof(int)>1){};52 // OK, a template.53 auto Y = []<typename T>(T t) requires (sizeof(int)>1){};54 55 X(1);56 Y(1);57}58 59template<typename T>60union U {61 void f() requires true;62};63}64