All smaller than int types are promoted to int before calculations are done. I was wrong that uint32_t is smaller than int though.
For an actual example:
uint32_t combineTwoUint16(uint16_t x, uint16_t y)
{
return x<<16 | y;
}
If int is larger than 16 bits, then this is technically undefined behavior in the case that x is greater than 2^15 as it's signed integer overflow.