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 исходит от обессахаривания:

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

Но если говорить более фундаментально, то это плохой ярлык для обозначения циклов: у нас нет синтаксиса для аннотирования переменных цикла.

Согласитесь, мы должны проверить этот случай.

Исправлено в # 52418.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги