// { dg-do compile { target c++20 } } // Change in grammar for the expression trailing `requires`. template requires true != false // { dg-error "must be enclosed" } void f1(T) { } template void f3(T) requires true != false // { dg-error "must be enclosed" } { } template requires requires { requires true == false; // OK: logical-or-expressions allowed here. } void f3(T) { } template concept bool C1 = true; // { dg-error "bool|variable concepts" } template bool concept C2 = true; // { dg-error "concept definition syntax|variable concepts" } template concept C3 = true; // OK template concept C3 = true; // { dg-error "redefinition" } template concept C3 = true; // { dg-error "different template parameters" } template concept C3 = true; // { dg-error "different template parameters" } int C3 = 0; // { dg-error "different kind of entity" } int C4 = 0; template concept C4 = true; // { dg-error "different kind of entity" } // Concepts as expressions template concept True = true; template concept False = false; static_assert(True); static_assert(False); // { dg-error "static assertion failed" } void f4(True auto); template concept C5 = true; // { dg-error "cannot be constrained" } template concept Recursive = Recursive; // { dg-error "not declared|expected" }