summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-11-21 21:20:20 +0000
committerbors <bors@rust-lang.org>2021-11-21 21:20:20 +0000
commitcebd2dda1d9071f2209079370c412f4ef9ef2b82 (patch)
treeff90842dc821a514ae5a8fd9bf429f353eef64cb /library/std/src
parent65f3f8b220f020e562c5dd848ff7319257a7ba45 (diff)
parent66da8faf176cf5fbdd198371f80ff58b3ed50cf9 (diff)
downloadrust-cebd2dda1d9071f2209079370c412f4ef9ef2b82.tar.gz
rust-cebd2dda1d9071f2209079370c412f4ef9ef2b82.zip
Auto merge of #90352 - camsteffen:for-loop-desugar, r=oli-obk
Simplify `for` loop desugar

Basically two intermediate bindings are inlined. I could have left one intermediate binding in place as this would simplify some diagnostic logic, but I think the difference in that regard would be negligible, so it is better to have a minimal HIR.

For checking that the pattern is irrefutable, I added a special case when the `match` is found to be non-exhaustive.

The reordering of the arms is purely stylistic. I don't *think* there are any perf implications.

```diff
  match IntoIterator::into_iter($head) {
      mut iter => {
          $label: loop {
-             let mut __next;
              match Iterator::next(&mut iter) {
-                 Some(val) => __next = val,
                  None => break,
+                 Some($pat) => $block,
              }
-             let $pat = __next;
-             $block
          }
      }
  }
```
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/keyword_docs.rs5
1 files changed, 1 insertions, 4 deletions
diff --git a/library/std/src/keyword_docs.rs b/library/std/src/keyword_docs.rs
index a8365071d61..a370485102e 100644
--- a/library/std/src/keyword_docs.rs
+++ b/library/std/src/keyword_docs.rs
@@ -549,13 +549,10 @@ mod fn_keyword {}
 /// {
 ///     let result = match IntoIterator::into_iter(iterator) {
 ///         mut iter => loop {
-///             let next;
 ///             match iter.next() {
-///                 Some(val) => next = val,
 ///                 None => break,
+///                 Some(loop_variable) => { code(); },
 ///             };
-///             let loop_variable = next;
-///             let () = { code(); };
 ///         },
 ///     };
 ///     result