Skip to content

Commit a551e5f

Browse files
committed
Diagnostics for let mut in item context
1 parent a8e75c5 commit a551e5f

File tree

4 files changed

+35
-9
lines changed

4 files changed

+35
-9
lines changed

compiler/rustc_parse/src/parser/item.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,25 @@ impl<'a> Parser<'a> {
7777
if !self.eat(term) {
7878
let token_str = super::token_descr(&self.token);
7979
if !self.maybe_consume_incorrect_semicolon(items.last().map(|x| &**x)) {
80+
let is_let = self.token.is_keyword(kw::Let);
81+
let is_let_mut = is_let && self.look_ahead(1, |t| t.is_keyword(kw::Mut));
82+
8083
let msg = format!("expected item, found {token_str}");
8184
let mut err = self.dcx().struct_span_err(self.token.span, msg);
82-
let span = self.token.span;
83-
if self.is_kw_followed_by_ident(kw::Let) {
84-
err.span_label(
85-
span,
86-
"consider using `const` or `static` instead of `let` for global variables",
87-
);
85+
86+
let label = if is_let {
87+
"`let` cannot be used for global variables"
8888
} else {
89-
err.span_label(span, "expected item")
90-
.note("for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>");
89+
"expected item"
90+
};
91+
err.span_label(self.token.span, label);
92+
93+
if is_let_mut {
94+
err.help("consider using `static` and a `Mutex` instead of `let mut`");
95+
} else if is_let {
96+
err.help("consider using `const` or `static` instead of `let`");
9197
};
98+
err.note("for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>");
9299
return Err(err);
93100
}
94101
}

tests/ui/parser/suggest-const-for-global-var.stderr

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ error: expected item, found keyword `let`
22
--> $DIR/suggest-const-for-global-var.rs:1:1
33
|
44
LL | let X: i32 = 12;
5-
| ^^^ consider using `const` or `static` instead of `let` for global variables
5+
| ^^^ `let` cannot be used for global variables
6+
|
7+
= help: consider using `const` or `static` instead of `let`
8+
= note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
69

710
error: aborting due to 1 previous error
811

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
let mut _data = vec![1,2,3];
2+
//~^ ERROR expected item, found keyword `let`
3+
4+
fn main() {
5+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
error: expected item, found keyword `let`
2+
--> $DIR/suggest-static-for-global-var-mut.rs:1:1
3+
|
4+
LL | let mut _data = vec![1,2,3];
5+
| ^^^ `let` cannot be used for global variables
6+
|
7+
= help: consider using `static` and a `Mutex` instead of `let mut`
8+
= note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
9+
10+
error: aborting due to 1 previous error
11+

0 commit comments

Comments
 (0)