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