@@ -869,8 +869,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Resolver<'a> {
869869 debug ! ( "(resolving function) entering function" ) ;
870870 let rib_kind = match function_kind {
871871 FnKind :: ItemFn ( ..) => FnItemRibKind ,
872- FnKind :: Method ( ..) => AssocItemRibKind ,
873- FnKind :: Closure ( _) => NormalRibKind ,
872+ FnKind :: Method ( ..) | FnKind :: Closure ( _) => NormalRibKind ,
874873 } ;
875874
876875 // Create a value rib for the function.
@@ -2307,21 +2306,32 @@ impl<'a> Resolver<'a> {
23072306 if ident. name == kw:: Invalid {
23082307 return Some ( LexicalScopeBinding :: Res ( Res :: Err ) ) ;
23092308 }
2310- ident . span = if ident. name == kw:: SelfUpper {
2309+ let ( general_span , modern_span ) = if ident. name == kw:: SelfUpper {
23112310 // FIXME(jseyfried) improve `Self` hygiene
2312- ident. span . with_ctxt ( SyntaxContext :: empty ( ) )
2311+ let empty_span = ident. span . with_ctxt ( SyntaxContext :: empty ( ) ) ;
2312+ ( empty_span, empty_span)
23132313 } else if ns == TypeNS {
2314- ident. span . modern ( )
2314+ let modern_span = ident. span . modern ( ) ;
2315+ ( modern_span, modern_span)
23152316 } else {
2316- ident. span . modern_and_legacy ( )
2317+ ( ident. span . modern_and_legacy ( ) , ident . span . modern ( ) )
23172318 } ;
2319+ ident. span = general_span;
2320+ let modern_ident = Ident { span : modern_span, ..ident } ;
23182321
23192322 // Walk backwards up the ribs in scope.
23202323 let record_used = record_used_id. is_some ( ) ;
23212324 let mut module = self . graph_root ;
23222325 for i in ( 0 .. self . ribs [ ns] . len ( ) ) . rev ( ) {
23232326 debug ! ( "walk rib\n {:?}" , self . ribs[ ns] [ i] . bindings) ;
2324- if let Some ( res) = self . ribs [ ns] [ i] . bindings . get ( & ident) . cloned ( ) {
2327+ // Use the rib kind to determine whether we are resolving parameters
2328+ // (modern hygiene) or local variables (legacy hygiene).
2329+ let rib_ident = if let AssocItemRibKind | ItemRibKind = self . ribs [ ns] [ i] . kind {
2330+ modern_ident
2331+ } else {
2332+ ident
2333+ } ;
2334+ if let Some ( res) = self . ribs [ ns] [ i] . bindings . get ( & rib_ident) . cloned ( ) {
23252335 // The ident resolves to a type parameter or local variable.
23262336 return Some ( LexicalScopeBinding :: Res (
23272337 self . validate_res_from_ribs ( ns, i, res, record_used, path_span) ,
@@ -2357,7 +2367,7 @@ impl<'a> Resolver<'a> {
23572367 }
23582368 }
23592369
2360- ident. span = ident . span . modern ( ) ;
2370+ ident = modern_ident ;
23612371 let mut poisoned = None ;
23622372 loop {
23632373 let opt_module = if let Some ( node_id) = record_used_id {
0 commit comments