https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109516
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Yann Droneaud from comment #4) > (In reply to Andrew Pinski from comment #1) > > > > Basically GCC decided that the type of the bitfield uint48 has a type of > > unsigned:48 and since it is larger size than int, it does not get promoted > > to int and in this cases gets passed to the variadic function as that type. > > I wouldn't have expected bitfield type to be "visible" outside of its > structure. Yes I understand that, but C actually has the idea of that being a type. > > And I failed to comprehend how unsigned long int:48 can be passed to a > variadic function without being promoted to plain unsigned long int ... Oh yes, there is no way for an user to get the value back via va_arg really. But this is just how C has an implementation defined behavior here really.