Skip to content

Commit c20ee3e

Browse files
committed
Add comments ensuring that generics are cleaned before args
Otherwise, rustdoc panics with messages like this: thread 'rustc' panicked at 'assertion failed: cx.impl_trait_bounds.is_empty()', src/librustdoc/clean/utils.rs:462:5 This ordering requirement is unrelated to the `clean_fn_decl_with_args` refactoring, but the requirement was uncovered as part of that change. I'm not sure if *all* of these places have the requirement, but I added comments to them just in case.
1 parent c615b11 commit c20ee3e

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

Diff for: src/librustdoc/clean/inline.rs

+1
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ fn build_external_function(cx: &mut DocContext<'_>, did: DefId) -> clean::Functi
229229
let asyncness = cx.tcx.asyncness(did);
230230
let predicates = cx.tcx.predicates_of(did);
231231
let (generics, decl) = clean::enter_impl_trait(cx, |cx| {
232+
// NOTE: generics need to be cleaned before the decl!
232233
((cx.tcx.generics_of(did), predicates).clean(cx), (did, sig).clean(cx))
233234
});
234235
clean::Function {

Diff for: src/librustdoc/clean/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,7 @@ fn clean_fn_or_proc_macro(
765765
impl<'a> Clean<Function> for (&'a hir::FnSig<'a>, &'a hir::Generics<'a>, hir::BodyId) {
766766
fn clean(&self, cx: &mut DocContext<'_>) -> Function {
767767
let (generics, decl) = enter_impl_trait(cx, |cx| {
768+
// NOTE: generics must be cleaned before args
768769
let generics = self.1.clean(cx);
769770
let args = (self.0.decl.inputs, self.2).clean(cx);
770771
let decl = clean_fn_decl_with_args(cx, self.0.decl, args);
@@ -896,6 +897,7 @@ impl Clean<Item> for hir::TraitItem<'_> {
896897
}
897898
hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Required(names)) => {
898899
let (generics, decl) = enter_impl_trait(cx, |cx| {
900+
// NOTE: generics must be cleaned before args
899901
let generics = self.generics.clean(cx);
900902
let args = (sig.decl.inputs, names).clean(cx);
901903
let decl = clean_fn_decl_with_args(cx, sig.decl, args);
@@ -1732,6 +1734,7 @@ impl Clean<PathSegment> for hir::PathSegment<'_> {
17321734
impl Clean<BareFunctionDecl> for hir::BareFnTy<'_> {
17331735
fn clean(&self, cx: &mut DocContext<'_>) -> BareFunctionDecl {
17341736
let (generic_params, decl) = enter_impl_trait(cx, |cx| {
1737+
// NOTE: generics must be cleaned before args
17351738
let generic_params = self.generic_params.iter().map(|x| x.clean(cx)).collect();
17361739
let args = (self.decl.inputs, self.param_names).clean(cx);
17371740
let decl = clean_fn_decl_with_args(cx, self.decl, args);
@@ -2032,6 +2035,7 @@ impl Clean<Item> for (&hir::ForeignItem<'_>, Option<Symbol>) {
20322035
hir::ForeignItemKind::Fn(decl, names, ref generics) => {
20332036
let abi = cx.tcx.hir().get_foreign_abi(item.hir_id());
20342037
let (generics, decl) = enter_impl_trait(cx, |cx| {
2038+
// NOTE: generics must be cleaned before args
20352039
let generics = generics.clean(cx);
20362040
let args = (decl.inputs, names).clean(cx);
20372041
let decl = clean_fn_decl_with_args(cx, decl, args);

0 commit comments

Comments
 (0)