Skip to content

Commit

Permalink
Unrolled build for rust-lang#136869
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#136869 - chenyukang:yukang-fix-133713-let-binding, r=estebank

Fix diagnostic when using = instead of : in let binding

Fixes rust-lang#133713

r? ``@estebank``
  • Loading branch information
rust-timer authored Feb 14, 2025
2 parents a567209 + a917fd5 commit 653bfce
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 1 deletion.
23 changes: 22 additions & 1 deletion compiler/rustc_resolve/src/late/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2347,9 +2347,14 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
// try to give a suggestion for this pattern: `name = blah`, which is common in other languages
// suggest `let name = blah` to introduce a new binding
fn let_binding_suggestion(&mut self, err: &mut Diag<'_>, ident_span: Span) -> bool {
if ident_span.from_expansion() {
return false;
}

// only suggest when the code is a assignment without prefix code
if let Some(Expr { kind: ExprKind::Assign(lhs, ..), .. }) = self.diag_metadata.in_assignment
&& let ast::ExprKind::Path(None, ref path) = lhs.kind
&& !ident_span.from_expansion()
&& self.r.tcx.sess.source_map().is_line_before_span_empty(ident_span)
{
let (span, text) = match path.segments.first() {
Some(seg) if let Some(name) = seg.ident.as_str().strip_prefix("let") => {
Expand All @@ -2368,6 +2373,22 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
);
return true;
}

// a special case for #133713
// '=' maybe a typo of `:`, which is a type annotation instead of assignment
if err.code == Some(E0423)
&& let Some((let_span, None, Some(val_span))) = self.diag_metadata.current_let_binding
&& val_span.contains(ident_span)
&& val_span.lo() == ident_span.lo()
{
err.span_suggestion_verbose(
let_span.shrink_to_hi().to(val_span.shrink_to_lo()),
"you might have meant to use `:` for type annotation",
": ",
Applicability::MaybeIncorrect,
);
return true;
}
false
}

Expand Down
12 changes: 12 additions & 0 deletions tests/ui/suggestions/let-binding-suggest-issue-133713.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//@ run-rustfix
#![allow(dead_code)]

fn demo1() {
let _last: u64 = 0; //~ ERROR expected value, found builtin type `u64`
}

fn demo2() {
let _val: u64; //~ ERROR expected value, found builtin type `u64`
}

fn main() {}
12 changes: 12 additions & 0 deletions tests/ui/suggestions/let-binding-suggest-issue-133713.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//@ run-rustfix
#![allow(dead_code)]

fn demo1() {
let _last = u64 = 0; //~ ERROR expected value, found builtin type `u64`
}

fn demo2() {
let _val = u64; //~ ERROR expected value, found builtin type `u64`
}

fn main() {}
27 changes: 27 additions & 0 deletions tests/ui/suggestions/let-binding-suggest-issue-133713.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
error[E0423]: expected value, found builtin type `u64`
--> $DIR/let-binding-suggest-issue-133713.rs:5:17
|
LL | let _last = u64 = 0;
| ^^^
|
help: you might have meant to use `:` for type annotation
|
LL - let _last = u64 = 0;
LL + let _last: u64 = 0;
|

error[E0423]: expected value, found builtin type `u64`
--> $DIR/let-binding-suggest-issue-133713.rs:9:16
|
LL | let _val = u64;
| ^^^
|
help: you might have meant to use `:` for type annotation
|
LL - let _val = u64;
LL + let _val: u64;
|

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0423`.

0 comments on commit 653bfce

Please sign in to comment.