Rollup merge of #92963 - terrarier2111:tuple-diagnostic, r=davidtwco

Implement tuple array diagnostic

Fixes https://github.com/rust-lang/rust/issues/92089
This commit is contained in:
Matthias Krüger 2022-01-21 22:03:16 +01:00 committed by GitHub
commit 1f3a2dd0b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 5 deletions

View File

@ -307,6 +307,36 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
}
/// Give appropriate suggestion when encountering `[("a", 0) ("b", 1)]`, where the
/// likely intention is to create an array containing tuples.
fn maybe_suggest_bad_array_definition(
&self,
err: &mut DiagnosticBuilder<'a>,
call_expr: &'tcx hir::Expr<'tcx>,
callee_expr: &'tcx hir::Expr<'tcx>,
) -> bool {
let hir_id = self.tcx.hir().get_parent_node(call_expr.hir_id);
let parent_node = self.tcx.hir().get(hir_id);
if let (
hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Array(_), .. }),
hir::ExprKind::Tup(exp),
hir::ExprKind::Call(_, args),
) = (parent_node, &callee_expr.kind, &call_expr.kind)
{
if args.len() == exp.len() {
let start = callee_expr.span.shrink_to_hi();
err.span_suggestion(
start,
"consider separating array elements with a comma",
",".to_string(),
Applicability::MaybeIncorrect,
);
return true;
}
}
false
}
fn confirm_builtin_call(
&self,
call_expr: &'tcx hir::Expr<'tcx>,
@ -422,7 +452,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
_ => Res::Err,
};
err.span_label(call_expr.span, "call expression requires function");
if !self.maybe_suggest_bad_array_definition(&mut err, call_expr, callee_expr) {
err.span_label(call_expr.span, "call expression requires function");
}
if let Some(span) = self.tcx.hir().res_span(def) {
let callee_ty = callee_ty.to_string();

View File

@ -59,10 +59,8 @@ LL | &(true, false) => ()
error[E0618]: expected function, found `(char, char)`
--> $DIR/issue-5100.rs:48:14
|
LL | let v = [('a', 'b')
| ______________-^^^^^^^^^
LL | | ('c', 'd'),
| |_______________________- call expression requires function
LL | let v = [('a', 'b')
| ^^^^^^^^^^- help: consider separating array elements with a comma: `,`
error[E0308]: mismatched types
--> $DIR/issue-5100.rs:55:19

View File

@ -0,0 +1,7 @@
fn main() {
let _tmp = [
("C200B40A82", 3),
("C200B40A83", 4) //~ ERROR: expected function, found `(&'static str, {integer})` [E0618]
("C200B40A8537", 5),
];
}

View File

@ -0,0 +1,9 @@
error[E0618]: expected function, found `(&'static str, {integer})`
--> $DIR/array-diagnostics.rs:4:9
|
LL | ("C200B40A83", 4)
| ^^^^^^^^^^^^^^^^^- help: consider separating array elements with a comma: `,`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0618`.