https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84031
Bug ID: 84031 Summary: structured binding unpacks nameless padding bitfields Product: gcc Version: 7.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: will at dash dot org Target Milestone: --- In g++ >= 7.1.0 nameless bitfields are unpacked in structured binding declarations. GCC compiles this code with no error or warning. using uint8_t = unsigned char; struct bits8 { uint8_t :1, b1:1, b23:2, :1, b567:3; }; static_assert(sizeof(bits8)==1); int main() { static constexpr bits8 byte{1,2,3}; const auto& [b0,b1,b23,b4,b567] = byte; static_assert(b1==1 && b23==2 && b567==3); static_assert(b0==0 && b4==0); } Clang, on the other hand, does not accept this code - it chooses not to unpack nameless bitfields (Clang error: type 'const bits8' decomposes into 3 elements, but 5 names were provided). GCC errors on this code which clang accepts: int main() { static constexpr bits8 byte{1,2,3}; const auto& [b1,b23,b567] = byte; static_assert(b1==1 && b23==2 && b567==3); } GCC error: only 3 names provided for structured binding const auto& [b1,b23,b567] = byte; ^~~~~~~~~~~~~ note: while 'const bits8' decomposes into 5 elements I believe that g++ behavior is incorrect. The intent is for the binding declarations to match identifiers. This interpretation is symmetrical with the braced-init-list where at most 3 values can be specified to initialize only the named bitfield members. The nameless ones are passed over...