Rust: рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдЧреИрд░-рдореМрдЬреВрдж рдЪрд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ `__next`

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдордИ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдпрд╣ рдХреЛрдб: ( рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ )

fn main() {
    let tiles = Default::default();
    for row in &mut tiles {
        for tile in row {
            *tile = 0;
        }
    }

    let tiles: [[usize; 3]; 3] = tiles;
}

рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓:

error[E0282]: type annotations needed
 --> src/main.rs:5:13
  |
4 |         for tile in row {
  |             ---- consider giving `__next` a type
5 |             *tile = 0;
  |             ^^^^^ cannot infer type for `_`

рдЗрд╕ рдХреЛрдб рдкрд░ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди (рдареАрдХ рд╣реИ) рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗрд░рд┐рдПрдмрд▓ рдЬреЛ рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдЙрд╕реЗ __next рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдЪрд░ рд╣реИред

A-diagnostics C-bug

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЦреИрд░, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛-

diff --git a/src/librustc/infer/error_reporting/need_type_info.rs b/src/librustc/infer/error_reporting/need_type_info.rs
index 7352c14..25bfb3e 100644
--- a/src/librustc/infer/error_reporting/need_type_info.rs
+++ b/src/librustc/infer/error_reporting/need_type_info.rs
@@ -131,7 +131,10 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
             labels.clear();
             labels.push((pattern.span, format!("consider giving this closure parameter a type")));
         } else if let Some(pattern) = local_visitor.found_local_pattern {
-            if let Some(simple_name) = pattern.simple_name() {
+            // don't put internal desugared-loop identifier in user-facing
+            // message (Issue #51116)
+            let simple_name = pattern.simple_name().filter(|n| n.as_str() != "__next");
+            if let Some(simple_name) = simple_name {
                 labels.push((pattern.span, format!("consider giving `{}` a type", simple_name)));
             } else {
                 labels.push((pattern.span, format!("consider giving the pattern a type")));

рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд▓реВрдк рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдмрд▓ рдирд╣реАрдВ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реВрдк рд╡реИрд░рд┐рдПрдмрд▓ рдЯрд╛рдЗрдк-рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИред

__next desugaring рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ:

https://github.com/rust-lang/rust/blob/5ae5361cdd7b4e518d6733fb726521563d5b4cfa/src/librustc/hir/lowering.rs#L3355 -L3501

рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд▓реВрдк рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдмрд▓ рдирд╣реАрдВ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реВрдк рд╡реИрд░рд┐рдПрдмрд▓ рдЯрд╛рдЗрдк-рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИред

рд╕рд╣рдордд рд╣реВрдВ, рд╣рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

#52418 рдореЗрдВ рдлрд┐рдХреНрд╕реНрдбред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Robbepop picture Robbepop  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wthrowe picture wthrowe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmegaffin picture jmegaffin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zhendongsu picture zhendongsu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lambda-fairy picture lambda-fairy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ