The promotions that are really surprising are from uint64_t bitfields to int (because it's based on value representability).
struct { uint64_t a : 33, b : 15; } s; // s.b gets "promoted" to int, s.a does not