https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96411
Bug ID: 96411 Summary: erroneous "trait used in its own initializer" error when using concepts in a requirement Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: barry.revzin at gmail dot com Target Milestone: --- Reduced from StackOverflow (https://stackoverflow.com/q/63202619/2069064): template <typename> constexpr bool trait = true; template <typename T> concept C = trait<T>; void f(auto) { []<typename T>(){ requires { C<T>; }; }; } int main() { f(42); } This fails on gcc 10.2 with: <source>: In instantiation of 'void f(auto:1) [with auto:1 = int]': <source>:10:18: required from here <source>:2:31: required by the constraints of 'template<class T> concept C' <source>:2:35: error: the value of 'trait<T>' is not usable in a constant expression 2 | template <typename T> concept C = trait<T>; | ^~~~~~~~ <source>:1:36: note: 'trait<T>' used in its own initializer 1 | template <typename> constexpr bool trait = true; | ^~~~~ Compiler returned: 1 But trait<T> isn't used in its own initializer, and trait<T> is certainly usable in a constant expression.