Skip to content

Commit ddd034a

Browse files
Fix invalid bounds string generation in rustdoc
1 parent 2002b4b commit ddd034a

File tree

6 files changed

+26
-11
lines changed

6 files changed

+26
-11
lines changed

src/librustc_typeck/collect.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1918,7 +1918,15 @@ fn explicit_predicates_of<'a, 'tcx>(
19181918
}
19191919
}
19201920

1921-
let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
1921+
let hir_id = match tcx.hir().as_local_hir_id(def_id) {
1922+
Some(hir_id) => hir_id,
1923+
None => {
1924+
return Lrc::new(ty::GenericPredicates {
1925+
parent: None,
1926+
predicates: Vec::new(),
1927+
})
1928+
}
1929+
};
19221930
let node = tcx.hir().get_by_hir_id(hir_id);
19231931

19241932
let mut is_trait = None;

src/librustdoc/clean/auto_trait.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
568568
(replaced.clone(), replaced.clean(self.cx))
569569
});
570570

571-
let full_generics = (&type_generics, &tcx.predicates_of(did));
571+
let full_generics = (&type_generics, &tcx.explicit_predicates_of(did));
572572
let Generics {
573573
params: mut generic_params,
574574
..

src/librustdoc/clean/blanket_impl.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
132132
.collect();
133133

134134
let ty = self.cx.get_real_ty(def_id, def_ctor, &real_name, generics);
135-
let predicates = infcx.tcx.predicates_of(impl_def_id);
135+
let predicates = infcx.tcx.explicit_predicates_of(impl_def_id);
136136

137137
impls.push(Item {
138138
source: infcx.tcx.def_span(impl_def_id).clean(self.cx),

src/librustdoc/clean/inline.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ fn build_external_function(cx: &DocContext<'_>, did: DefId) -> clean::Function {
228228
}
229229

230230
fn build_enum(cx: &DocContext<'_>, did: DefId) -> clean::Enum {
231-
let predicates = cx.tcx.predicates_of(did);
231+
let predicates = cx.tcx.explicit_predicates_of(did);
232232

233233
clean::Enum {
234234
generics: (cx.tcx.generics_of(did), &predicates).clean(cx),
@@ -238,7 +238,7 @@ fn build_enum(cx: &DocContext<'_>, did: DefId) -> clean::Enum {
238238
}
239239

240240
fn build_struct(cx: &DocContext<'_>, did: DefId) -> clean::Struct {
241-
let predicates = cx.tcx.predicates_of(did);
241+
let predicates = cx.tcx.explicit_predicates_of(did);
242242
let variant = cx.tcx.adt_def(did).non_enum_variant();
243243

244244
clean::Struct {
@@ -254,7 +254,7 @@ fn build_struct(cx: &DocContext<'_>, did: DefId) -> clean::Struct {
254254
}
255255

256256
fn build_union(cx: &DocContext<'_>, did: DefId) -> clean::Union {
257-
let predicates = cx.tcx.predicates_of(did);
257+
let predicates = cx.tcx.explicit_predicates_of(did);
258258
let variant = cx.tcx.adt_def(did).non_enum_variant();
259259

260260
clean::Union {
@@ -266,7 +266,7 @@ fn build_union(cx: &DocContext<'_>, did: DefId) -> clean::Union {
266266
}
267267

268268
fn build_type_alias(cx: &DocContext<'_>, did: DefId) -> clean::Typedef {
269-
let predicates = cx.tcx.predicates_of(did);
269+
let predicates = cx.tcx.explicit_predicates_of(did);
270270

271271
clean::Typedef {
272272
type_: cx.tcx.type_of(did).clean(cx),
@@ -325,7 +325,7 @@ pub fn build_impl(cx: &DocContext<'_>, did: DefId, ret: &mut Vec<clean::Item>) {
325325
}
326326
}
327327

328-
let predicates = tcx.predicates_of(did);
328+
let predicates = tcx.explicit_predicates_of(did);
329329
let (trait_items, generics) = if let Some(hir_id) = tcx.hir().as_local_hir_id(did) {
330330
match tcx.hir().expect_item_by_hir_id(hir_id).node {
331331
hir::ItemKind::Impl(.., ref gen, _, _, ref item_ids) => {

src/librustdoc/clean/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2281,7 +2281,7 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
22812281
}
22822282
ty::AssociatedKind::Method => {
22832283
let generics = (cx.tcx.generics_of(self.def_id),
2284-
&cx.tcx.predicates_of(self.def_id)).clean(cx);
2284+
&cx.tcx.explicit_predicates_of(self.def_id)).clean(cx);
22852285
let sig = cx.tcx.fn_sig(self.def_id);
22862286
let mut decl = (self.def_id, sig).clean(cx);
22872287

@@ -2354,7 +2354,7 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
23542354
// are actually located on the trait/impl itself, so we need to load
23552355
// all of the generics from there and then look for bounds that are
23562356
// applied to this associated type in question.
2357-
let predicates = cx.tcx.predicates_of(did);
2357+
let predicates = cx.tcx.explicit_predicates_of(did);
23582358
let generics = (cx.tcx.generics_of(did), &predicates).clean(cx);
23592359
let mut bounds = generics.where_predicates.iter().filter_map(|pred| {
23602360
let (name, self_type, trait_, bounds) = match *pred {
@@ -3062,7 +3062,7 @@ impl<'tcx> Clean<Type> for Ty<'tcx> {
30623062
ty::Opaque(def_id, substs) => {
30633063
// Grab the "TraitA + TraitB" from `impl TraitA + TraitB`,
30643064
// by looking up the projections associated with the def_id.
3065-
let predicates_of = cx.tcx.predicates_of(def_id);
3065+
let predicates_of = cx.tcx.explicit_predicates_of(def_id);
30663066
let substs = cx.tcx.lift(&substs).expect("Opaque lift failed");
30673067
let bounds = predicates_of.instantiate(cx.tcx, substs);
30683068
let mut regions = vec![];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
use std::marker::PhantomData;
2+
3+
// @has useless_lifetime_bound/struct.Scope.html
4+
// @!has - '//*[@class="rust struct"]' "'env: 'env"
5+
pub struct Scope<'env> {
6+
_marker: PhantomData<&'env mut &'env ()>,
7+
}

0 commit comments

Comments
 (0)