@@ -77,18 +77,35 @@ 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+ let let_has_ident = is_let && !is_let_mut && self . is_kw_followed_by_ident ( kw:: Let ) ;
83+
8084 let msg = format ! ( "expected item, found {token_str}" ) ;
8185 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- ) ;
86+
87+ let label = if is_let {
88+ "`let` cannot be used for global variables"
8889 } 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>" ) ;
90+ "expected item"
9191 } ;
92+ err. span_label ( self . token . span , label) ;
93+
94+ if is_let {
95+ if is_let_mut {
96+ err. help ( "consider using `static` and a `Mutex` instead of `let mut`" ) ;
97+ } else if let_has_ident {
98+ err. span_suggestion_short (
99+ self . token . span ,
100+ "consider using `static` or `const` instead of `let`" ,
101+ "static" ,
102+ Applicability :: MaybeIncorrect ,
103+ ) ;
104+ } else {
105+ err. help ( "consider using `static` or `const` instead of `let`" ) ;
106+ }
107+ }
108+ err. note ( "for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>" ) ;
92109 return Err ( err) ;
93110 }
94111 }
0 commit comments