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)

Reply via email to