@@ -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 } ;
@@ -2126,11 +2127,26 @@ impl<'a> Parser<'a> {
2126
2127
vis : & Visibility ,
2127
2128
case : Case ,
2128
2129
) -> PResult < ' a , ( Ident , FnSig , Generics , Option < P < Block > > ) > {
2130
+ let fn_span = self . token . span ;
2129
2131
let header = self . parse_fn_front_matter ( vis, case) ?; // `const ... fn`
2130
2132
let ident = self . parse_ident ( ) ?; // `foo`
2131
2133
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
+ } ;
2134
2150
generics. where_clause = self . parse_where_clause ( ) ?; // `where T: Ord`
2135
2151
2136
2152
let mut sig_hi = self . prev_token . span ;
0 commit comments