-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Note an edge case in array/slice pattern handling
- Loading branch information
Showing
5 changed files
with
112 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
//@ edition: 2021 | ||
// skip-filecheck | ||
|
||
// Under the Rust 2021 disjoint capture rules, a "captured" place sometimes | ||
// doesn't actually need to be captured, if it is only matched against | ||
// irrefutable patterns that don't bind anything. | ||
// | ||
// When that happens, there is currently some MIR-building code | ||
// (`Builder::prefix_slice_suffix`) that can no longer distinguish between | ||
// array patterns and slice patterns, so it falls back to the code for dealing | ||
// with slice patterns. | ||
// | ||
// That appears to be benign, but it's worth having a test that explicitly | ||
// triggers the edge-case scenario. If someone makes a change that assumes the | ||
// edge case can't happen, then hopefully this test will demand attention by | ||
// either triggering an ICE, or needing its MIR to be re-blessed. | ||
|
||
// EMIT_MIR array_non_capture.prefix_only-{closure#0}.built.after.mir | ||
fn prefix_only() -> u32 { | ||
let arr = [1, 2, 3]; | ||
let closure = || match arr { | ||
[_, _, _] => 101u32, | ||
}; | ||
closure() | ||
} | ||
|
||
// EMIT_MIR array_non_capture.prefix_slice_only-{closure#0}.built.after.mir | ||
fn prefix_slice_only() -> u32 { | ||
let arr = [1, 2, 3]; | ||
let closure = || match arr { | ||
[_, ..] => 102u32, | ||
}; | ||
closure() | ||
} | ||
|
||
// EMIT_MIR array_non_capture.prefix_slice_suffix-{closure#0}.built.after.mir | ||
fn prefix_slice_suffix() -> u32 { | ||
let arr = [1, 2, 3]; | ||
let closure = || match arr { | ||
[_, .., _] => 103u32, | ||
}; | ||
closure() | ||
} |
18 changes: 18 additions & 0 deletions
18
tests/mir-opt/building/match/array_non_capture.prefix_only-{closure#0}.built.after.mir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// MIR for `prefix_only::{closure#0}` after built | ||
|
||
fn prefix_only::{closure#0}(_1: &{closure@$DIR/array-non-capture.rs:21:19: 21:21}) -> u32 { | ||
let mut _0: u32; | ||
|
||
bb0: { | ||
_0 = const 101_u32; | ||
goto -> bb2; | ||
} | ||
|
||
bb1: { | ||
unreachable; | ||
} | ||
|
||
bb2: { | ||
return; | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
tests/mir-opt/building/match/array_non_capture.prefix_slice_only-{closure#0}.built.after.mir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// MIR for `prefix_slice_only::{closure#0}` after built | ||
|
||
fn prefix_slice_only::{closure#0}(_1: &{closure@$DIR/array-non-capture.rs:30:19: 30:21}) -> u32 { | ||
let mut _0: u32; | ||
|
||
bb0: { | ||
_0 = const 102_u32; | ||
goto -> bb2; | ||
} | ||
|
||
bb1: { | ||
unreachable; | ||
} | ||
|
||
bb2: { | ||
return; | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
.../mir-opt/building/match/array_non_capture.prefix_slice_suffix-{closure#0}.built.after.mir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// MIR for `prefix_slice_suffix::{closure#0}` after built | ||
|
||
fn prefix_slice_suffix::{closure#0}(_1: &{closure@$DIR/array-non-capture.rs:39:19: 39:21}) -> u32 { | ||
let mut _0: u32; | ||
|
||
bb0: { | ||
_0 = const 103_u32; | ||
goto -> bb2; | ||
} | ||
|
||
bb1: { | ||
unreachable; | ||
} | ||
|
||
bb2: { | ||
return; | ||
} | ||
} |