File tree Expand file tree Collapse file tree 1 file changed +52
-0
lines changed
src/doc/unstable-book/src/language-features Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Original file line number Diff line number Diff line change 1+ # ` loop_match `
2+
3+ The tracking issue for this feature is: [ #132306 ]
4+
5+ [ #132306 ] : https://github.com/rust-lang/rust/issues/132306
6+
7+ ------
8+
9+ The ` #[loop_match] ` and ` #[const_continue] ` attributes can be used to improve the code
10+ generation of logic that fits this shape:
11+
12+ ``` ignore (pseudo-rust)
13+ loop {
14+ state = 'blk: {
15+ match state {
16+ State::A => {
17+ break 'blk State::B
18+ }
19+ State::B => { /* ... */ }
20+ /* ... */
21+ }
22+ }
23+ }
24+ ```
25+
26+ Here the loop itself can be annotated with ` #[loop_match] ` , and any ` break 'blk ` with
27+ ` #[const_continue] ` if the value is know at compile time:
28+
29+ ``` ignore (pseudo-rust)
30+ #[loop_match]
31+ loop {
32+ state = 'blk: {
33+ match state {
34+ State::A => {
35+ #[const_continue]
36+ break 'blk State::B
37+ }
38+ State::B => { /* ... */ }
39+ /* ... */
40+ }
41+ }
42+ }
43+ ```
44+
45+ The observable behavior of this loop is exactly the same as without the extra attributes.
46+ The difference is in the generated output: normally, when the state is ` A ` , control flow
47+ moves from the ` A ` branch, back to the top of the loop, then to the ` B ` branch. With the
48+ attributes, The ` A ` branch will immediately jump to the ` B ` branch.
49+
50+ Removing the indirection can be beneficial for stack usage and branch prediction, and
51+ enables other optimizations by clearly splitting out the control flow paths that your
52+ program will actually use.
You can’t perform that action at this time.
0 commit comments