Instead, I suggest:
let x=3;
let x=4;
let mut x=5;
Do this:
let x=3;
hat x=4;
hat mut x=5;
Since Rust specializes in catching human oversights, and shadowing is somewhat akin to pointers, I believe that shadowing should also be caught at the syntactic level.
Would you mind elaborating on this point? I don't see any semantic similarities between shadowing and pointers.
While I can see that sometimes a let i = 0; somewhere in a long function, deep within nested loops may cause subtle bugs, I don't think a syntax change for shadowing would be warranted, as these issues are usually best solved with better abstractions.