@@ -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 } ;
@@ -2131,11 +2132,26 @@ impl<'a> Parser<'a> {
21312132 vis : & Visibility ,
21322133 case : Case ,
21332134 ) -> PResult < ' a , ( Ident , FnSig , Generics , Option < P < Block > > ) > {
2135+ let fn_span = self . token . span ;
21342136 let header = self . parse_fn_front_matter ( vis, case) ?; // `const ... fn`
21352137 let ident = self . parse_ident ( ) ?; // `foo`
21362138 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+ } ;
21392155 generics. where_clause = self . parse_where_clause ( ) ?; // `where T: Ord`
21402156
21412157 let mut sig_hi = self . prev_token . span ;
0 commit comments