https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105061
Bug ID: 105061 Summary: [9/10 Regression] [c++2a+] anonymous bitfield templated offset rejected Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: wjwray at gmail dot com Target Milestone: --- A very specific regression: https://godbolt.org/z/dWxnvd93j template <typename alloc_unit, int width, int offset> struct offset_bitfield { alloc_unit : offset, field : width; }; accepted forever with -std=c++17- accepted in 9.4 with -std=c++2a rejected in 10.1+ with -std=c++20+ (accepted in Clang & MSVC, any std) My guess as to the cause: the c++20 change to allow bitfield initializers. template <typename alloc_unit, int width, int offset> struct offset_bitfield { alloc_unit : offset, field : width; }; // ^ ^ // error: found ':' in nested-name-specifier, expected '::' // error: expected unqualified-id before ',' token The template is accepted if the typename parameter is removed: template <int width, int offset> struct uint_offset_bitfield { unsigned : offset, field : width; };