RFR: 5038439: Warning message for literal shift amounts outside the canonical domain [v5]

Archie Cobbs acobbs at openjdk.org
Fri Nov 14 21:25:40 UTC 2025


> When bit shifting an `int` or `long` value by an amount `X`, all but the last 5 or 6 (respectively) bits of `X` are ignored.
> 
> This can create a trap for the unwary, as in this example:
> 
> public long readLongBigEndian(byte[] buf, int offset) {
>     return ((buf[offset + 0] & 0xff) << 56)   // BUG HERE
>          | ((buf[offset + 1] & 0xff) << 48)   // BUG HERE
>          | ((buf[offset + 2] & 0xff) << 40)   // BUG HERE
>          | ((buf[offset + 3] & 0xff) << 32)   // BUG HERE
>          | ((buf[offset + 4] & 0xff) << 24)
>          | ((buf[offset + 5] & 0xff) << 16)
>          | ((buf[offset + 6] & 0xff) << 8)
>          | ((buf[offset + 7] & 0xff);
> }
> 
> This PR adds a new warning when the compiler detects an out-of-range bit shift, i.e., an `int` bit shift not in the range `[-31...31]` or a `long` bit shift not in the range `[-63...63]`.

Archie Cobbs has updated the pull request incrementally with one additional commit since the last revision:

  Add more verbosity to "lossy-conversions" description in @SuppressWarnings table.

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/27102/files
  - new: https://git.openjdk.org/jdk/pull/27102/files/4156e813..dc326cd3

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=27102&range=04
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=27102&range=03-04

  Stats: 2 lines in 1 file changed: 1 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/27102.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/27102/head:pull/27102

PR: https://git.openjdk.org/jdk/pull/27102


More information about the compiler-dev mailing list