1 // { dg-do compile { target c++20 } } 2 3 // Change in grammar for the expression trailing `requires`. 4 template<typename T> 5 requires true != false // { dg-error "must be enclosed" } 6 void f1(T) 7 { } 8 9 template<typename T> 10 void f3(T) requires true != false // { dg-error "must be enclosed" } 11 { } 12 13 template<typename T> 14 requires requires { 15 requires true == false; // OK: logical-or-expressions allowed here. 16 } f3(T)17void f3(T) 18 { } 19 20 template<typename T> 21 concept bool C1 = true; // { dg-error "bool" } 22 template<typename T> 23 bool concept C2 = true; // { dg-error "concept definition syntax" } 24 25 template<typename T> 26 concept C3 = true; // OK 27 template<typename T> 28 concept C3 = true; // { dg-error "redefinition" } 29 template<typename T, typename U> 30 concept C3 = true; // { dg-error "different template parameters" } 31 template<int> 32 concept C3 = true; // { dg-error "different template parameters" } 33 int C3 = 0; // { dg-error "different kind of entity" } 34 35 int C4 = 0; 36 template<typename T> 37 concept C4 = true; // { dg-error "different kind of entity" } 38 39 // Concepts as expressions 40 41 template<typename T> 42 concept True = true; 43 44 template<typename T> 45 concept False = false; 46 47 static_assert(True<int>); 48 static_assert(False<int>); // { dg-error "static assertion failed" } 49 50 void f4(True auto); 51 52 template<True T> concept C5 = true; // { dg-error "cannot be constrained" } 53 54 55 template<typename T> 56 concept Recursive = Recursive<T>; // { dg-error "not declared|expected" } 57 58