How to address this problem?
fn foo(x: u32) { }
let x: u16;
let y: u16;
foo(x * y);
`x` and `y` would have to be multiplied before they are widened to `u32`. This creates an overflow bug that may only be visible in the released code (release mode has arithmetic overflow checking off by default).