Shifts a left by shift_amt. Returns an error on overflow. shift_amt is unsigned.
pub fn shlExact(comptime T: type, a: T, shift_amt: Log2Int(T)) !T
pub fn shlExact(comptime T: type, a: T, shift_amt: Log2Int(T)) !T {
if (T == comptime_int) return a << shift_amt;
const ov = @shlWithOverflow(a, shift_amt);
if (ov[1] != 0) return error.Overflow;
return ov[0];
}