Wherein we uncover a conundrum with how bit shifts are implemented in Rust.
Wow! That is some fancy type-dueling right there!
I had to read it a couple of times to figure it out, even though you line it up quite nicely. Dark wizardry indeed!
Do I understand correctly that the compiler applies two phases of type-inference to the
<<? First the method, which defaults to
i32, then it finds the implementation, so u32, but doesn’t “update” the inference for
That seems like it should require a compiler-side fix?
In the compiler source you link, I found this comment:
// Supply type inference hints if relevant. Probably these // hints should be enforced during select as part of the // `consider_unification_despite_ambiguity` routine, but this // more convenient for now.
Especially the “more convenient for now” seems to imply there is room for improvement here. Is there any issue filed for this?