Lower bindings in a predictable order
This commit is contained in:
parent
97bfa106c7
commit
00497ad24b
@ -43,24 +43,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
// let y = x;
|
// let y = x;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// We can't just reverse the binding order, because we must preserve pattern-order
|
// We therefore lower bindings from left-to-right, except we lower the `x` in `x @ pat`
|
||||||
// otherwise, e.g. in `let (Some(a), Some(b)) = (x, y)`. Our rule then is: deepest-first,
|
// after any bindings in `pat`. This doesn't work for or-patterns: the current structure of
|
||||||
// and bindings at the same depth stay in source order.
|
// match lowering forces us to lower bindings inside or-patterns last.
|
||||||
//
|
|
||||||
// To do this, every time around the loop we prepend the newly found bindings to the
|
|
||||||
// bindings we already had.
|
|
||||||
//
|
|
||||||
// example:
|
|
||||||
// candidate.bindings = [1, 2, 3]
|
|
||||||
// bindings in iter 1: [4, 5]
|
|
||||||
// bindings in iter 2: [6, 7]
|
|
||||||
//
|
|
||||||
// final bindings: [6, 7, 4, 5, 1, 2, 3]
|
|
||||||
let mut accumulated_bindings = mem::take(candidate_bindings);
|
|
||||||
let mut simplified_match_pairs = Vec::new();
|
|
||||||
// Repeatedly simplify match pairs until we're left with only unsimplifiable ones.
|
|
||||||
loop {
|
|
||||||
for mut match_pair in mem::take(match_pairs) {
|
for mut match_pair in mem::take(match_pairs) {
|
||||||
|
self.simplify_match_pairs(
|
||||||
|
&mut match_pair.subpairs,
|
||||||
|
candidate_bindings,
|
||||||
|
candidate_ascriptions,
|
||||||
|
);
|
||||||
if let TestCase::Irrefutable { binding, ascription } = match_pair.test_case {
|
if let TestCase::Irrefutable { binding, ascription } = match_pair.test_case {
|
||||||
if let Some(binding) = binding {
|
if let Some(binding) = binding {
|
||||||
candidate_bindings.push(binding);
|
candidate_bindings.push(binding);
|
||||||
@ -68,35 +59,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
if let Some(ascription) = ascription {
|
if let Some(ascription) = ascription {
|
||||||
candidate_ascriptions.push(ascription);
|
candidate_ascriptions.push(ascription);
|
||||||
}
|
}
|
||||||
// Simplifiable pattern; we replace it with its subpairs and simplify further.
|
// Simplifiable pattern; we replace it with its already simplified subpairs.
|
||||||
match_pairs.append(&mut match_pair.subpairs);
|
match_pairs.append(&mut match_pair.subpairs);
|
||||||
} else {
|
} else {
|
||||||
// Unsimplifiable pattern; we recursively simplify its subpairs and don't
|
// Unsimplifiable pattern; we keep it.
|
||||||
// process it further.
|
match_pairs.push(match_pair);
|
||||||
self.simplify_match_pairs(
|
|
||||||
&mut match_pair.subpairs,
|
|
||||||
candidate_bindings,
|
|
||||||
candidate_ascriptions,
|
|
||||||
);
|
|
||||||
simplified_match_pairs.push(match_pair);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This does: accumulated_bindings = candidate.bindings.take() ++ accumulated_bindings
|
|
||||||
candidate_bindings.extend_from_slice(&accumulated_bindings);
|
|
||||||
mem::swap(candidate_bindings, &mut accumulated_bindings);
|
|
||||||
candidate_bindings.clear();
|
|
||||||
|
|
||||||
if match_pairs.is_empty() {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store computed bindings back in `candidate_bindings`.
|
|
||||||
mem::swap(candidate_bindings, &mut accumulated_bindings);
|
|
||||||
// Store simplified match pairs back in `match_pairs`.
|
|
||||||
mem::swap(match_pairs, &mut simplified_match_pairs);
|
|
||||||
|
|
||||||
// Move or-patterns to the end, because they can result in us
|
// Move or-patterns to the end, because they can result in us
|
||||||
// creating additional candidates, so we want to test them as
|
// creating additional candidates, so we want to test them as
|
||||||
// late as possible.
|
// late as possible.
|
||||||
|
@ -51,13 +51,13 @@
|
|||||||
- }
|
- }
|
||||||
-
|
-
|
||||||
- bb3: {
|
- bb3: {
|
||||||
StorageLive(_9);
|
|
||||||
_9 = (((_3.1: std::option::Option<u32>) as Some).0: u32);
|
|
||||||
StorageLive(_8);
|
StorageLive(_8);
|
||||||
_8 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
_8 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
||||||
|
StorageLive(_9);
|
||||||
|
_9 = (((_3.1: std::option::Option<u32>) as Some).0: u32);
|
||||||
_0 = const 0_u32;
|
_0 = const 0_u32;
|
||||||
StorageDead(_8);
|
|
||||||
StorageDead(_9);
|
StorageDead(_9);
|
||||||
|
StorageDead(_8);
|
||||||
- goto -> bb4;
|
- goto -> bb4;
|
||||||
+ goto -> bb3;
|
+ goto -> bb3;
|
||||||
}
|
}
|
||||||
|
@ -57,13 +57,13 @@
|
|||||||
- }
|
- }
|
||||||
-
|
-
|
||||||
- bb4: {
|
- bb4: {
|
||||||
StorageLive(_10);
|
|
||||||
_10 = (((_3.1: std::option::Option<u32>) as Some).0: u32);
|
|
||||||
StorageLive(_9);
|
StorageLive(_9);
|
||||||
_9 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
_9 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
||||||
|
StorageLive(_10);
|
||||||
|
_10 = (((_3.1: std::option::Option<u32>) as Some).0: u32);
|
||||||
_0 = const 0_u32;
|
_0 = const 0_u32;
|
||||||
StorageDead(_9);
|
|
||||||
StorageDead(_10);
|
StorageDead(_10);
|
||||||
|
StorageDead(_9);
|
||||||
- goto -> bb6;
|
- goto -> bb6;
|
||||||
+ goto -> bb4;
|
+ goto -> bb4;
|
||||||
}
|
}
|
||||||
|
@ -51,13 +51,13 @@
|
|||||||
- }
|
- }
|
||||||
-
|
-
|
||||||
- bb3: {
|
- bb3: {
|
||||||
StorageLive(_9);
|
|
||||||
_9 = (((_3.1: std::option::Option<bool>) as Some).0: bool);
|
|
||||||
StorageLive(_8);
|
StorageLive(_8);
|
||||||
_8 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
_8 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
||||||
|
StorageLive(_9);
|
||||||
|
_9 = (((_3.1: std::option::Option<bool>) as Some).0: bool);
|
||||||
_0 = const 0_u32;
|
_0 = const 0_u32;
|
||||||
StorageDead(_8);
|
|
||||||
StorageDead(_9);
|
StorageDead(_9);
|
||||||
|
StorageDead(_8);
|
||||||
- goto -> bb4;
|
- goto -> bb4;
|
||||||
+ goto -> bb3;
|
+ goto -> bb3;
|
||||||
}
|
}
|
||||||
|
@ -69,16 +69,16 @@
|
|||||||
|
|
||||||
- bb4: {
|
- bb4: {
|
||||||
+ bb3: {
|
+ bb3: {
|
||||||
StorageLive(_13);
|
|
||||||
_13 = (((_4.2: std::option::Option<u32>) as Some).0: u32);
|
|
||||||
StorageLive(_12);
|
|
||||||
_12 = (((_4.1: std::option::Option<u32>) as Some).0: u32);
|
|
||||||
StorageLive(_11);
|
StorageLive(_11);
|
||||||
_11 = (((_4.0: std::option::Option<u32>) as Some).0: u32);
|
_11 = (((_4.0: std::option::Option<u32>) as Some).0: u32);
|
||||||
|
StorageLive(_12);
|
||||||
|
_12 = (((_4.1: std::option::Option<u32>) as Some).0: u32);
|
||||||
|
StorageLive(_13);
|
||||||
|
_13 = (((_4.2: std::option::Option<u32>) as Some).0: u32);
|
||||||
_0 = const 0_u32;
|
_0 = const 0_u32;
|
||||||
StorageDead(_11);
|
|
||||||
StorageDead(_12);
|
|
||||||
StorageDead(_13);
|
StorageDead(_13);
|
||||||
|
StorageDead(_12);
|
||||||
|
StorageDead(_11);
|
||||||
- goto -> bb5;
|
- goto -> bb5;
|
||||||
+ goto -> bb4;
|
+ goto -> bb4;
|
||||||
}
|
}
|
||||||
|
@ -116,12 +116,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
bb6: {
|
bb6: {
|
||||||
StorageLive(_13);
|
|
||||||
_39 = deref_copy (_4.1: &ViewportPercentageLength);
|
|
||||||
_13 = (((*_39) as Vw).0: f32);
|
|
||||||
StorageLive(_12);
|
StorageLive(_12);
|
||||||
_40 = deref_copy (_4.0: &ViewportPercentageLength);
|
_39 = deref_copy (_4.0: &ViewportPercentageLength);
|
||||||
_12 = (((*_40) as Vw).0: f32);
|
_12 = (((*_39) as Vw).0: f32);
|
||||||
|
StorageLive(_13);
|
||||||
|
_40 = deref_copy (_4.1: &ViewportPercentageLength);
|
||||||
|
_13 = (((*_40) as Vw).0: f32);
|
||||||
StorageLive(_14);
|
StorageLive(_14);
|
||||||
StorageLive(_15);
|
StorageLive(_15);
|
||||||
_15 = _12;
|
_15 = _12;
|
||||||
@ -132,18 +132,18 @@
|
|||||||
StorageDead(_15);
|
StorageDead(_15);
|
||||||
_3 = ViewportPercentageLength::Vw(move _14);
|
_3 = ViewportPercentageLength::Vw(move _14);
|
||||||
StorageDead(_14);
|
StorageDead(_14);
|
||||||
StorageDead(_12);
|
|
||||||
StorageDead(_13);
|
StorageDead(_13);
|
||||||
|
StorageDead(_12);
|
||||||
goto -> bb10;
|
goto -> bb10;
|
||||||
}
|
}
|
||||||
|
|
||||||
bb7: {
|
bb7: {
|
||||||
StorageLive(_18);
|
|
||||||
_41 = deref_copy (_4.1: &ViewportPercentageLength);
|
|
||||||
_18 = (((*_41) as Vh).0: f32);
|
|
||||||
StorageLive(_17);
|
StorageLive(_17);
|
||||||
_42 = deref_copy (_4.0: &ViewportPercentageLength);
|
_41 = deref_copy (_4.0: &ViewportPercentageLength);
|
||||||
_17 = (((*_42) as Vh).0: f32);
|
_17 = (((*_41) as Vh).0: f32);
|
||||||
|
StorageLive(_18);
|
||||||
|
_42 = deref_copy (_4.1: &ViewportPercentageLength);
|
||||||
|
_18 = (((*_42) as Vh).0: f32);
|
||||||
StorageLive(_19);
|
StorageLive(_19);
|
||||||
StorageLive(_20);
|
StorageLive(_20);
|
||||||
_20 = _17;
|
_20 = _17;
|
||||||
@ -154,18 +154,18 @@
|
|||||||
StorageDead(_20);
|
StorageDead(_20);
|
||||||
_3 = ViewportPercentageLength::Vh(move _19);
|
_3 = ViewportPercentageLength::Vh(move _19);
|
||||||
StorageDead(_19);
|
StorageDead(_19);
|
||||||
StorageDead(_17);
|
|
||||||
StorageDead(_18);
|
StorageDead(_18);
|
||||||
|
StorageDead(_17);
|
||||||
goto -> bb10;
|
goto -> bb10;
|
||||||
}
|
}
|
||||||
|
|
||||||
bb8: {
|
bb8: {
|
||||||
StorageLive(_23);
|
|
||||||
_43 = deref_copy (_4.1: &ViewportPercentageLength);
|
|
||||||
_23 = (((*_43) as Vmin).0: f32);
|
|
||||||
StorageLive(_22);
|
StorageLive(_22);
|
||||||
_44 = deref_copy (_4.0: &ViewportPercentageLength);
|
_43 = deref_copy (_4.0: &ViewportPercentageLength);
|
||||||
_22 = (((*_44) as Vmin).0: f32);
|
_22 = (((*_43) as Vmin).0: f32);
|
||||||
|
StorageLive(_23);
|
||||||
|
_44 = deref_copy (_4.1: &ViewportPercentageLength);
|
||||||
|
_23 = (((*_44) as Vmin).0: f32);
|
||||||
StorageLive(_24);
|
StorageLive(_24);
|
||||||
StorageLive(_25);
|
StorageLive(_25);
|
||||||
_25 = _22;
|
_25 = _22;
|
||||||
@ -176,18 +176,18 @@
|
|||||||
StorageDead(_25);
|
StorageDead(_25);
|
||||||
_3 = ViewportPercentageLength::Vmin(move _24);
|
_3 = ViewportPercentageLength::Vmin(move _24);
|
||||||
StorageDead(_24);
|
StorageDead(_24);
|
||||||
StorageDead(_22);
|
|
||||||
StorageDead(_23);
|
StorageDead(_23);
|
||||||
|
StorageDead(_22);
|
||||||
goto -> bb10;
|
goto -> bb10;
|
||||||
}
|
}
|
||||||
|
|
||||||
bb9: {
|
bb9: {
|
||||||
StorageLive(_28);
|
|
||||||
_45 = deref_copy (_4.1: &ViewportPercentageLength);
|
|
||||||
_28 = (((*_45) as Vmax).0: f32);
|
|
||||||
StorageLive(_27);
|
StorageLive(_27);
|
||||||
_46 = deref_copy (_4.0: &ViewportPercentageLength);
|
_45 = deref_copy (_4.0: &ViewportPercentageLength);
|
||||||
_27 = (((*_46) as Vmax).0: f32);
|
_27 = (((*_45) as Vmax).0: f32);
|
||||||
|
StorageLive(_28);
|
||||||
|
_46 = deref_copy (_4.1: &ViewportPercentageLength);
|
||||||
|
_28 = (((*_46) as Vmax).0: f32);
|
||||||
StorageLive(_29);
|
StorageLive(_29);
|
||||||
StorageLive(_30);
|
StorageLive(_30);
|
||||||
_30 = _27;
|
_30 = _27;
|
||||||
@ -198,8 +198,8 @@
|
|||||||
StorageDead(_30);
|
StorageDead(_30);
|
||||||
_3 = ViewportPercentageLength::Vmax(move _29);
|
_3 = ViewportPercentageLength::Vmax(move _29);
|
||||||
StorageDead(_29);
|
StorageDead(_29);
|
||||||
StorageDead(_27);
|
|
||||||
StorageDead(_28);
|
StorageDead(_28);
|
||||||
|
StorageDead(_27);
|
||||||
goto -> bb10;
|
goto -> bb10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,13 +59,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
bb5: {
|
bb5: {
|
||||||
StorageLive(_10);
|
|
||||||
_10 = (((_3.1: std::option::Option<u32>) as Some).0: u32);
|
|
||||||
StorageLive(_9);
|
StorageLive(_9);
|
||||||
_9 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
_9 = (((_3.0: std::option::Option<u32>) as Some).0: u32);
|
||||||
|
StorageLive(_10);
|
||||||
|
_10 = (((_3.1: std::option::Option<u32>) as Some).0: u32);
|
||||||
_0 = const 0_u32;
|
_0 = const 0_u32;
|
||||||
StorageDead(_9);
|
|
||||||
StorageDead(_10);
|
StorageDead(_10);
|
||||||
|
StorageDead(_9);
|
||||||
goto -> bb8;
|
goto -> bb8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,8 +19,7 @@ fn match_tuple(_1: (u32, bool, Option<i32>, u32)) -> u32 {
|
|||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
PlaceMention(_1);
|
PlaceMention(_1);
|
||||||
_2 = discriminant((_1.2: std::option::Option<i32>));
|
switchInt((_1.0: u32)) -> [1: bb2, 4: bb2, otherwise: bb1];
|
||||||
switchInt(move _2) -> [0: bb3, 1: bb2, otherwise: bb1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bb1: {
|
bb1: {
|
||||||
@ -29,11 +28,12 @@ fn match_tuple(_1: (u32, bool, Option<i32>, u32)) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bb2: {
|
bb2: {
|
||||||
switchInt((((_1.2: std::option::Option<i32>) as Some).0: i32)) -> [1: bb3, 8: bb3, otherwise: bb1];
|
_2 = discriminant((_1.2: std::option::Option<i32>));
|
||||||
|
switchInt(move _2) -> [0: bb4, 1: bb3, otherwise: bb1];
|
||||||
}
|
}
|
||||||
|
|
||||||
bb3: {
|
bb3: {
|
||||||
switchInt((_1.0: u32)) -> [1: bb4, 4: bb4, otherwise: bb1];
|
switchInt((((_1.2: std::option::Option<i32>) as Some).0: i32)) -> [1: bb4, 8: bb4, otherwise: bb1];
|
||||||
}
|
}
|
||||||
|
|
||||||
bb4: {
|
bb4: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user