MIR operators: clarify Shl/Shr handling of negative offsets · rust-lang/rust@0afd50e

File tree

1 file changed

lines changed

  • compiler/rustc_middle/src/mir

1 file changed

lines changed

Original file line numberDiff line numberDiff line change

@@ -1480,13 +1480,17 @@ pub enum BinOp {

14801480

BitOr,

14811481

/// The `<<` operator (shift left)

14821482

///

1483-

/// The offset is truncated to the size of the first operand and made unsigned before shifting.

1483+

/// The offset is (uniquely) determined as follows:

1484+

/// - it is "equal modulo LHS::BITS" to the RHS

1485+

/// - it is in the range `0..LHS::BITS`

14841486

Shl,

14851487

/// Like `Shl`, but is UB if the RHS >= LHS::BITS or RHS < 0

14861488

ShlUnchecked,

14871489

/// The `>>` operator (shift right)

14881490

///

1489-

/// The offset is truncated to the size of the first operand and made unsigned before shifting.

1491+

/// The offset is (uniquely) determined as follows:

1492+

/// - it is "equal modulo LHS::BITS" to the RHS

1493+

/// - it is in the range `0..LHS::BITS`

14901494

///

14911495

/// This is an arithmetic shift if the LHS is signed

14921496

/// and a logical shift if the LHS is unsigned.