https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109516
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Yann Droneaud from comment #7) > (In reply to Andrew Pinski from comment #6) > > > > > > 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. > > I understand, but can't refrain myself from thinking it's an unfortunate > discrepancy having a warning when formatting the uint64_t:48 case but not > for uint32_t:24 one. Because 24 is smaller than CHAR_BIT*sizeof(int) so it gets prompoted to int when passing it.