@@ -3,6 +3,7 @@ use crate::errors::{DocCommentDoesNotDocumentAnything, UseEmptyBlockNotSemi};
3
3
use super :: diagnostics:: { dummy_arg, ConsumeClosingDelim } ;
4
4
use super :: ty:: { AllowPlus , RecoverQPath , RecoverReturnSign } ;
5
5
use super :: { AttrWrapper , FollowedByType , ForceCollect , Parser , PathStyle , TrailingToken } ;
6
+ use crate :: errors:: FnTypoWithImpl ;
6
7
use rustc_ast:: ast:: * ;
7
8
use rustc_ast:: ptr:: P ;
8
9
use rustc_ast:: token:: { self , Delimiter , TokenKind } ;
@@ -2131,11 +2132,26 @@ impl<'a> Parser<'a> {
2131
2132
vis : & Visibility ,
2132
2133
case : Case ,
2133
2134
) -> PResult < ' a , ( Ident , FnSig , Generics , Option < P < Block > > ) > {
2135
+ let fn_span = self . token . span ;
2134
2136
let header = self . parse_fn_front_matter ( vis, case) ?; // `const ... fn`
2135
2137
let ident = self . parse_ident ( ) ?; // `foo`
2136
2138
let mut generics = self . parse_generics ( ) ?; // `<'a, T, ...>`
2137
- let decl =
2138
- self . parse_fn_decl ( fn_parse_mode. req_name , AllowPlus :: Yes , RecoverReturnSign :: Yes ) ?; // `(p: u8, ...)`
2139
+ let decl = match self . parse_fn_decl (
2140
+ fn_parse_mode. req_name ,
2141
+ AllowPlus :: Yes ,
2142
+ RecoverReturnSign :: Yes ,
2143
+ ) {
2144
+ Ok ( decl) => decl,
2145
+ Err ( old_err) => {
2146
+ // If we see `for Ty ...` then user probably meant `impl` item.
2147
+ if self . token . is_keyword ( kw:: For ) {
2148
+ old_err. cancel ( ) ;
2149
+ return Err ( self . sess . create_err ( FnTypoWithImpl { fn_span } ) ) ;
2150
+ } else {
2151
+ return Err ( old_err) ;
2152
+ }
2153
+ }
2154
+ } ;
2139
2155
generics. where_clause = self . parse_where_clause ( ) ?; // `where T: Ord`
2140
2156
2141
2157
let mut sig_hi = self . prev_token . span ;
0 commit comments