Skip to content

Commit ef30a8f

Browse files
track extern traits being inlined
1 parent d98449d commit ef30a8f

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

src/librustdoc/clean/inline.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,16 @@ fn separate_supertrait_bounds(mut g: clean::Generics)
494494
}
495495

496496
pub fn record_extern_trait(cx: &DocContext, did: DefId) {
497-
if cx.external_traits.borrow().contains_key(did) {
497+
if cx.external_traits.borrow().contains_key(&did) &&
498+
cx.active_extern_traits.borrow().contains(&did)
499+
{
498500
return;
499501
}
500502

503+
cx.active_extern_traits.borrow_mut().push(did);
504+
501505
let trait_ = build_external_trait(cx, did);
502506

503507
cx.external_traits.borrow_mut().insert(did, trait_);
508+
cx.active_extern_traits.borrow_mut().remove_item(&did);
504509
}

src/librustdoc/core.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ pub struct DocContext<'a, 'tcx: 'a, 'rcx: 'a> {
5858
pub renderinfo: RefCell<RenderInfo>,
5959
/// Later on moved through `clean::Crate` into `html::render::CACHE_KEY`
6060
pub external_traits: RefCell<FxHashMap<DefId, clean::Trait>>,
61+
/// Used while populating `external_traits` to ensure we don't process the same trait twice at
62+
/// the same time.
63+
pub active_extern_traits: RefCell<Vec<DefId>>,
6164
// The current set of type and lifetime substitutions,
6265
// for expanding type aliases at the HIR level:
6366

@@ -236,6 +239,7 @@ pub fn run_core(search_paths: SearchPaths,
236239
populated_all_crate_impls: Cell::new(false),
237240
access_levels: RefCell::new(access_levels),
238241
external_traits: Default::default(),
242+
active_extern_traits: Default::default(),
239243
renderinfo: Default::default(),
240244
ty_substs: Default::default(),
241245
lt_substs: Default::default(),

0 commit comments

Comments
 (0)