MISRA-C (2012) lists the following exception for that rule:
A non-negative integer constant expression of essentially signed type may be used as the right hand operand to a shift operator.
However, this is exactly what this repository lists as a non compiant example.
#[allow(unused_variables)]
fn main() {
let x: i32 = 0xFF;
let y = x << 2;
//~^ ERROR Non-compliant - inappropriate essential type
}