@@ -100,6 +100,7 @@ crate fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate
100
100
cx : & DocContext < ' _ > ,
101
101
map : & FxHashMap < DefId , & Type > ,
102
102
cleaner : & mut BadImplStripper < ' _ > ,
103
+ targets : & mut FxHashSet < DefId > ,
103
104
type_did : DefId ,
104
105
) {
105
106
if let Some ( target) = map. get ( & type_did) {
@@ -108,12 +109,12 @@ crate fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate
108
109
cleaner. prims . insert ( target_prim) ;
109
110
} else if let Some ( target_did) = target. def_id ( & cx. cache ) {
110
111
// `impl Deref<Target = S> for S`
111
- if target_did == type_did {
112
+ if !targets . insert ( target_did) {
112
113
// Avoid infinite cycles
113
114
return ;
114
115
}
115
116
cleaner. items . insert ( target_did. into ( ) ) ;
116
- add_deref_target ( cx, map, cleaner, target_did) ;
117
+ add_deref_target ( cx, map, cleaner, targets , target_did) ;
117
118
}
118
119
}
119
120
}
@@ -143,7 +144,15 @@ crate fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate
143
144
// `Deref` target type and the impl for type positions, this map of types is keyed by
144
145
// `DefId` and for convenience uses a special cleaner that accepts `DefId`s directly.
145
146
if cleaner. keep_impl_with_def_id ( for_did. into ( ) ) {
146
- add_deref_target ( cx, & type_did_to_deref_target, & mut cleaner, for_did) ;
147
+ let mut targets = FxHashSet :: default ( ) ;
148
+ targets. insert ( for_did) ;
149
+ add_deref_target (
150
+ cx,
151
+ & type_did_to_deref_target,
152
+ & mut cleaner,
153
+ & mut targets,
154
+ for_did,
155
+ ) ;
147
156
}
148
157
}
149
158
}
0 commit comments