@@ -2052,13 +2052,15 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
20522052 // Handle `self` specially.
20532053 if index == 0 && has_self {
20542054 let self_lifetime = self . find_lifetime_for_self ( ty) ;
2055- if let Set1 :: One ( lifetime ) = self_lifetime {
2055+ elision_lifetime = match self_lifetime {
20562056 // We found `self` elision.
2057- elision_lifetime = Elision :: Self_ ( lifetime) ;
2058- } else {
2057+ Set1 :: One ( lifetime) => Elision :: Self_ ( lifetime) ,
2058+ // `self` itself had ambiguous lifetimes, e.g.
2059+ // &Box<&Self>
2060+ Set1 :: Many => Elision :: Err ,
20592061 // We do not have `self` elision: disregard the `Elision::Param` that we may
20602062 // have found.
2061- elision_lifetime = Elision :: None ;
2063+ Set1 :: Empty => Elision :: None ,
20622064 }
20632065 }
20642066 debug ! ( "(resolving function / closure) recorded parameter" ) ;
@@ -2082,6 +2084,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
20822084 r : & ' r Resolver < ' a , ' tcx > ,
20832085 impl_self : Option < Res > ,
20842086 lifetime : Set1 < LifetimeRes > ,
2087+ self_found : bool ,
20852088 }
20862089
20872090 impl SelfVisitor < ' _ , ' _ , ' _ > {
@@ -2105,7 +2108,11 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
21052108 impl < ' a > Visitor < ' a > for SelfVisitor < ' _ , ' _ , ' _ > {
21062109 fn visit_ty ( & mut self , ty : & ' a Ty ) {
21072110 trace ! ( "SelfVisitor considering ty={:?}" , ty) ;
2108- if let TyKind :: Ref ( lt, ref mt) = ty. kind && self . is_self_ty ( & mt. ty ) {
2111+ if self . is_self_ty ( ty) {
2112+ trace ! ( "SelfVisitor found Self" ) ;
2113+ self . self_found = true ;
2114+ }
2115+ if let TyKind :: Ref ( lt, _) = ty. kind {
21092116 let lt_id = if let Some ( lt) = lt {
21102117 lt. id
21112118 } else {
@@ -2146,10 +2153,11 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
21462153 Res :: Def ( DefKind :: Struct | DefKind :: Union | DefKind :: Enum , _, ) | Res :: PrimTy ( _)
21472154 )
21482155 } ) ;
2149- let mut visitor = SelfVisitor { r : self . r , impl_self, lifetime : Set1 :: Empty } ;
2156+ let mut visitor =
2157+ SelfVisitor { r : self . r , impl_self, lifetime : Set1 :: Empty , self_found : false } ;
21502158 visitor. visit_ty ( ty) ;
2151- trace ! ( "SelfVisitor found={:?}" , visitor. lifetime) ;
2152- visitor. lifetime
2159+ trace ! ( "SelfVisitor found={:?}, self_found={:?} " , visitor. lifetime, visitor . self_found ) ;
2160+ if visitor. self_found { visitor . lifetime } else { Set1 :: Empty }
21532161 }
21542162
21552163 /// Searches the current set of local scopes for labels. Returns the `NodeId` of the resolved
0 commit comments