@@ -77,18 +77,35 @@ impl<'a> Parser<'a> {
77
77
if !self . eat ( term) {
78
78
let token_str = super :: token_descr ( & self . token ) ;
79
79
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
+
80
84
let msg = format ! ( "expected item, found {token_str}" ) ;
81
85
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"
88
89
} 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"
91
91
} ;
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>" ) ;
92
109
return Err ( err) ;
93
110
}
94
111
}
0 commit comments