Rollup merge of #122437 - Nadrieril:no-after-max, r=compiler-errors

pattern analysis: remove `MaybeInfiniteInt::JustAfterMax`

It was inherited from before half-open ranges, but it doesn't pull its weight anymore. We lose a tiny bit of diagnostic precision as can be seen in the test. I'm generally in favor of half-open ranges over explicit `x..=MAX` ranges anyway.
This commit is contained in:
Matthias Krüger 2024-03-13 20:01:57 +01:00 committed by GitHub
commit 5c2aa6dc6f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 18 additions and 21 deletions

View File

@ -195,8 +195,6 @@ pub enum MaybeInfiniteInt {
/// Encoded value. DO NOT CONSTRUCT BY HAND; use `new_finite_{int,uint}`. /// Encoded value. DO NOT CONSTRUCT BY HAND; use `new_finite_{int,uint}`.
#[non_exhaustive] #[non_exhaustive]
Finite(u128), Finite(u128),
/// The integer after `u128::MAX`. We need it to represent `x..=u128::MAX` as an exclusive range.
JustAfterMax,
PosInfinity, PosInfinity,
} }
@ -232,18 +230,18 @@ impl MaybeInfiniteInt {
pub fn minus_one(self) -> Option<Self> { pub fn minus_one(self) -> Option<Self> {
match self { match self {
Finite(n) => n.checked_sub(1).map(Finite), Finite(n) => n.checked_sub(1).map(Finite),
JustAfterMax => Some(Finite(u128::MAX)),
x => Some(x), x => Some(x),
} }
} }
/// Note: this will not turn a finite value into an infinite one or vice-versa. /// Note: this will turn `u128::MAX` into `PosInfinity`. This means `plus_one` and `minus_one`
/// are not strictly inverses, but that poses no problem in our use of them.
/// this will not turn a finite value into an infinite one or vice-versa.
pub fn plus_one(self) -> Option<Self> { pub fn plus_one(self) -> Option<Self> {
match self { match self {
Finite(n) => match n.checked_add(1) { Finite(n) => match n.checked_add(1) {
Some(m) => Some(Finite(m)), Some(m) => Some(Finite(m)),
None => Some(JustAfterMax), None => Some(PosInfinity),
}, },
JustAfterMax => None,
x => Some(x), x => Some(x),
} }
} }
@ -277,8 +275,7 @@ impl IntRange {
} }
/// Construct a range with these boundaries. /// Construct a range with these boundaries.
/// `lo` must not be `PosInfinity` or `JustAfterMax`. `hi` must not be `NegInfinity`. /// `lo` must not be `PosInfinity`. `hi` must not be `NegInfinity`.
/// If `end` is `Included`, `hi` must also not be `JustAfterMax`.
#[inline] #[inline]
pub fn from_range(lo: MaybeInfiniteInt, mut hi: MaybeInfiniteInt, end: RangeEnd) -> IntRange { pub fn from_range(lo: MaybeInfiniteInt, mut hi: MaybeInfiniteInt, end: RangeEnd) -> IntRange {
if end == RangeEnd::Included { if end == RangeEnd::Included {

View File

@ -706,7 +706,7 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
None => PatRangeBoundary::PosInfinity, None => PatRangeBoundary::PosInfinity,
} }
} }
JustAfterMax | PosInfinity => PatRangeBoundary::PosInfinity, PosInfinity => PatRangeBoundary::PosInfinity,
} }
} }

View File

@ -394,17 +394,17 @@ help: ensure that all possible cases are being handled by adding a match arm wit
LL | match $s { $($t)+ => {}, u128::MAX => todo!() } LL | match $s { $($t)+ => {}, u128::MAX => todo!() }
| ++++++++++++++++++++++ | ++++++++++++++++++++++
error[E0004]: non-exhaustive patterns: `340282366920938463463374607431768211454_u128..=u128::MAX` not covered error[E0004]: non-exhaustive patterns: `340282366920938463463374607431768211454_u128..` not covered
--> $DIR/half-open-range-pats-exhaustive-fail.rs:93:12 --> $DIR/half-open-range-pats-exhaustive-fail.rs:93:12
| |
LL | m!(0, ..ALMOST_MAX); LL | m!(0, ..ALMOST_MAX);
| ^ pattern `340282366920938463463374607431768211454_u128..=u128::MAX` not covered | ^ pattern `340282366920938463463374607431768211454_u128..` not covered
| |
= note: the matched value is of type `u128` = note: the matched value is of type `u128`
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
| |
LL | match $s { $($t)+ => {}, 340282366920938463463374607431768211454_u128..=u128::MAX => todo!() } LL | match $s { $($t)+ => {}, 340282366920938463463374607431768211454_u128.. => todo!() }
| +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
error[E0004]: non-exhaustive patterns: `0_u128` not covered error[E0004]: non-exhaustive patterns: `0_u128` not covered
--> $DIR/half-open-range-pats-exhaustive-fail.rs:94:12 --> $DIR/half-open-range-pats-exhaustive-fail.rs:94:12
@ -754,17 +754,17 @@ help: ensure that all possible cases are being handled by adding a match arm wit
LL | match $s { $($t)+ => {}, i128::MAX => todo!() } LL | match $s { $($t)+ => {}, i128::MAX => todo!() }
| ++++++++++++++++++++++ | ++++++++++++++++++++++
error[E0004]: non-exhaustive patterns: `170141183460469231731687303715884105726_i128..=i128::MAX` not covered error[E0004]: non-exhaustive patterns: `170141183460469231731687303715884105726_i128..` not covered
--> $DIR/half-open-range-pats-exhaustive-fail.rs:161:12 --> $DIR/half-open-range-pats-exhaustive-fail.rs:161:12
| |
LL | m!(0, ..ALMOST_MAX); LL | m!(0, ..ALMOST_MAX);
| ^ pattern `170141183460469231731687303715884105726_i128..=i128::MAX` not covered | ^ pattern `170141183460469231731687303715884105726_i128..` not covered
| |
= note: the matched value is of type `i128` = note: the matched value is of type `i128`
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
| |
LL | match $s { $($t)+ => {}, 170141183460469231731687303715884105726_i128..=i128::MAX => todo!() } LL | match $s { $($t)+ => {}, 170141183460469231731687303715884105726_i128.. => todo!() }
| +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
error[E0004]: non-exhaustive patterns: `i128::MIN` not covered error[E0004]: non-exhaustive patterns: `i128::MIN` not covered
--> $DIR/half-open-range-pats-exhaustive-fail.rs:162:12 --> $DIR/half-open-range-pats-exhaustive-fail.rs:162:12

View File

@ -107,17 +107,17 @@ help: ensure that all possible cases are being handled by adding a match arm wit
LL | match $s { $($t)+ => {}, u128::MAX => todo!() } LL | match $s { $($t)+ => {}, u128::MAX => todo!() }
| ++++++++++++++++++++++ | ++++++++++++++++++++++
error[E0004]: non-exhaustive patterns: `5_u128..=u128::MAX` not covered error[E0004]: non-exhaustive patterns: `5_u128..` not covered
--> $DIR/exhaustiveness.rs:61:8 --> $DIR/exhaustiveness.rs:61:8
| |
LL | m!(0u128, 0..=4); LL | m!(0u128, 0..=4);
| ^^^^^ pattern `5_u128..=u128::MAX` not covered | ^^^^^ pattern `5_u128..` not covered
| |
= note: the matched value is of type `u128` = note: the matched value is of type `u128`
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
| |
LL | match $s { $($t)+ => {}, 5_u128..=u128::MAX => todo!() } LL | match $s { $($t)+ => {}, 5_u128.. => todo!() }
| +++++++++++++++++++++++++++++++ | +++++++++++++++++++++
error[E0004]: non-exhaustive patterns: `0_u128` not covered error[E0004]: non-exhaustive patterns: `0_u128` not covered
--> $DIR/exhaustiveness.rs:62:8 --> $DIR/exhaustiveness.rs:62:8