https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84516
Bug ID: 84516 Summary: bitfield temporaries > 32-bits have wrong type Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: gnu at mllr dot cc Target Milestone: --- (Disclaimer: I'm not a compiler guy, so I may accidentally use the wrong terminology) Example: https://godbolt.org/g/brhTMw #include <iostream> struct A { long x : 32; long y : 33; }; int main() { A a; std::cout << a.x; // OK std::cout << a.y; // OK std::cout << +a.x; // OK std::cout << +a.y; // BREAKS on gcc } The problem is the last line. The type of the expression `+a.y` is 'long int:33', which is not a type that operator<<() has an overload for. The type of the expression `a.y` is 'long int' and so op<<() has an overload and works. This issue seems to be affected by (a) The size of the bit field; <= 32 bits works, > 32 bits breaks. (b) Whether the bitfield is used in an expression producing a temporary; >32-bit size AND a temporary breaks, <= 32-bit size and an lvalue works. I confirmed this behavior on x86-64 gcc trunk using godbolt.org. (link again: https://godbolt.org/g/brhTMw)