Ce code : ( lien Aire de jeux )
fn main() {
let tiles = Default::default();
for row in &mut tiles {
for tile in row {
*tile = 0;
}
}
let tiles: [[usize; 3]; 3] = tiles;
}
Échec avec cette erreur :
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 `_`
L'inférence de type échoue (à juste titre) sur ce code. Cependant, la variable qu'il suggère de corriger s'appelle __next
et n'existe pas réellement dans mon code. Il s'agit probablement d'une variable interne générée par le compilateur.
Eh bien, refuser de nommer la variable dans ce cas serait assez simple—
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")));
Mais plus fondamentalement, ce n'est pas une bonne étiquette à définir sur les boucles : nous n'avons pas de syntaxe pour type-annoter les variables de boucle.
Le __next
vient du désucrage :
Mais plus fondamentalement, ce n'est pas une bonne étiquette à définir sur les boucles : nous n'avons pas de syntaxe pour type-annoter les variables de boucle.
D'accord, nous devrions vérifier ce cas.
Corrigé dans #52418.