Rollup merge of #144545 - ChayimFriedman2:bool-witness-order, r=Nadrieril

In rustc_pattern_analysis, put `true` witnesses before `false` witnesses

In rustc it doesn't really matter what the order of the witnesses is, but I'm planning to use the witnesses for implementing the "add missing match arms" assist in rust-analyzer, and there `true` before `false` is the natural order (like `Some` before `None`), and also what the current assist does.

The current order doesn't seem to be intentional; the code was created when bool ctors became their own thing, not just int ctors, but for integer, 0 before 1 is indeed the natural order.

r? `@Nadrieril`
This commit is contained in:
Trevor Gross
2025-08-08 14:22:44 -05:00
committed by GitHub
6 changed files with 15 additions and 12 deletions

View File

@@ -1130,16 +1130,16 @@ impl<Cx: PatCx> ConstructorSet<Cx> {
seen_false = true;
}
}
if seen_false {
present.push(Bool(false));
} else {
missing.push(Bool(false));
}
if seen_true {
present.push(Bool(true));
} else {
missing.push(Bool(true));
}
if seen_false {
present.push(Bool(false));
} else {
missing.push(Bool(false));
}
}
ConstructorSet::Integers { range_1, range_2 } => {
let seen_ranges: Vec<_> =

View File

@@ -176,6 +176,9 @@ fn test_witnesses() {
),
vec!["Enum::Variant1(_)", "Enum::Variant2(_)", "_"],
);
// Assert we put `true` before `false`.
assert_witnesses(AllOfThem, Ty::Bool, Vec::new(), vec!["true", "false"]);
}
#[test]

View File

@@ -15,7 +15,7 @@ fn main() {
}
match Box::new((true, Box::new(false))) {
//~^ ERROR non-exhaustive patterns: `deref!((false, deref!(false)))` and `deref!((true, deref!(true)))` not covered
//~^ ERROR non-exhaustive patterns: `deref!((true, deref!(true)))` and `deref!((false, deref!(false)))` not covered
(true, false) => {}
(false, true) => {}
}

View File

@@ -28,11 +28,11 @@ LL ~ true => {},
LL + deref!(deref!(false)) => todo!()
|
error[E0004]: non-exhaustive patterns: `deref!((false, deref!(false)))` and `deref!((true, deref!(true)))` not covered
error[E0004]: non-exhaustive patterns: `deref!((true, deref!(true)))` and `deref!((false, deref!(false)))` not covered
--> $DIR/non-exhaustive.rs:17:11
|
LL | match Box::new((true, Box::new(false))) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ patterns `deref!((false, deref!(false)))` and `deref!((true, deref!(true)))` not covered
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ patterns `deref!((true, deref!(true)))` and `deref!((false, deref!(false)))` not covered
|
note: `Box<(bool, Box<bool>)>` defined here
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
@@ -40,7 +40,7 @@ note: `Box<(bool, Box<bool>)>` defined here
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
LL ~ (false, true) => {},
LL + deref!((false, deref!(false))) | deref!((true, deref!(true))) => todo!()
LL + deref!((true, deref!(true))) | deref!((false, deref!(false))) => todo!()
|
error[E0004]: non-exhaustive patterns: `deref!((deref!(T::C), _))` not covered

View File

@@ -26,7 +26,7 @@ fn main() {
}
// Our approach can report duplicate witnesses sometimes.
match (x, true) {
//~^ ERROR non-exhaustive patterns: `(U8AsBool { n: 0_u8 }, false)`, `(U8AsBool { b: false }, false)`, `(U8AsBool { n: 0_u8 }, false)` and 1 more not covered
//~^ ERROR non-exhaustive patterns: `(U8AsBool { n: 0_u8 }, false)`, `(U8AsBool { b: true }, false)`, `(U8AsBool { n: 0_u8 }, false)` and 1 more not covered
(U8AsBool { b: true }, true) => {}
(U8AsBool { b: false }, true) => {}
(U8AsBool { n: 1.. }, true) => {}

View File

@@ -16,11 +16,11 @@ LL ~ U8AsBool { n: 1.. } => {},
LL + U8AsBool { n: 0_u8 } | U8AsBool { b: false } => todo!()
|
error[E0004]: non-exhaustive patterns: `(U8AsBool { n: 0_u8 }, false)`, `(U8AsBool { b: false }, false)`, `(U8AsBool { n: 0_u8 }, false)` and 1 more not covered
error[E0004]: non-exhaustive patterns: `(U8AsBool { n: 0_u8 }, false)`, `(U8AsBool { b: true }, false)`, `(U8AsBool { n: 0_u8 }, false)` and 1 more not covered
--> $DIR/unions.rs:28:15
|
LL | match (x, true) {
| ^^^^^^^^^ patterns `(U8AsBool { n: 0_u8 }, false)`, `(U8AsBool { b: false }, false)`, `(U8AsBool { n: 0_u8 }, false)` and 1 more not covered
| ^^^^^^^^^ patterns `(U8AsBool { n: 0_u8 }, false)`, `(U8AsBool { b: true }, false)`, `(U8AsBool { n: 0_u8 }, false)` and 1 more not covered
|
= note: the matched value is of type `(U8AsBool, bool)`
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern as shown, or multiple match arms