Skip to content

Commit 309b0de

Browse files
committed
(temporarily) skip normalization in rustdoc
1 parent ef96c03 commit 309b0de

14 files changed

Lines changed: 49 additions & 52 deletions

File tree

src/librustdoc/clean/auto_trait.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub(crate) fn synthesize_auto_trait_impls<'tcx>(
2222
) -> Vec<clean::Item> {
2323
let tcx = cx.tcx;
2424
let typing_env = ty::TypingEnv::non_body_analysis(tcx, item_def_id);
25-
let ty = tcx.type_of(item_def_id).instantiate_identity();
25+
let ty = tcx.type_of(item_def_id).instantiate_identity().skip_normalization();
2626

2727
let finder = auto_trait::AutoTraitFinder::new(tcx);
2828
let mut auto_trait_impls: Vec<_> = cx

src/librustdoc/clean/blanket_impl.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ pub(crate) fn synthesize_blanket_impls(
4040
}
4141
let infcx = tcx.infer_ctxt().build(TypingMode::non_body_analysis());
4242
let args = infcx.fresh_args_for_item(DUMMY_SP, item_def_id);
43-
let impl_ty = ty.instantiate(tcx, args);
43+
let impl_ty = ty.instantiate(tcx, args).skip_normalization();
4444
let param_env = ty::ParamEnv::empty();
4545

4646
let impl_args = infcx.fresh_args_for_item(DUMMY_SP, impl_def_id);
47-
let impl_trait_ref = trait_ref.instantiate(tcx, impl_args);
47+
let impl_trait_ref = trait_ref.instantiate(tcx, impl_args).skip_normalization();
4848

4949
// Require the type the impl is implemented on to match
5050
// our type, and ignore the impl if there was a mismatch.
@@ -60,8 +60,7 @@ pub(crate) fn synthesize_blanket_impls(
6060
drop(obligations);
6161

6262
let predicates = tcx
63-
.predicates_of(impl_def_id)
64-
.instantiate(tcx, impl_args)
63+
.predicates_of(impl_def_id).instantiate(tcx, impl_args).skip_normalization()
6564
.predicates
6665
.into_iter()
6766
.chain(Some(impl_trait_ref.upcast(tcx)));
@@ -95,11 +94,11 @@ pub(crate) fn synthesize_blanket_impls(
9594
// the post-inference `trait_ref`, as it's more accurate.
9695
trait_: Some(clean_trait_ref_with_constraints(
9796
cx,
98-
ty::Binder::dummy(trait_ref.instantiate_identity()),
97+
ty::Binder::dummy(trait_ref.instantiate_identity().skip_normalization()),
9998
ThinVec::new(),
10099
)),
101100
for_: clean_middle_ty(
102-
ty::Binder::dummy(ty.instantiate_identity()),
101+
ty::Binder::dummy(ty.instantiate_identity().skip_normalization()),
103102
cx,
104103
None,
105104
None,
@@ -112,7 +111,7 @@ pub(crate) fn synthesize_blanket_impls(
112111
.collect(),
113112
polarity: ty::ImplPolarity::Positive,
114113
kind: clean::ImplKind::Blanket(Box::new(clean_middle_ty(
115-
ty::Binder::dummy(trait_ref.instantiate_identity().self_ty()),
114+
ty::Binder::dummy(trait_ref.instantiate_identity().skip_normalization().self_ty()),
116115
cx,
117116
None,
118117
None,

src/librustdoc/clean/inline.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ fn build_trait_alias(cx: &mut DocContext<'_>, did: DefId) -> clean::TraitAlias {
309309
}
310310

311311
pub(super) fn build_function(cx: &mut DocContext<'_>, def_id: DefId) -> Box<clean::Function> {
312-
let sig = cx.tcx.fn_sig(def_id).instantiate_identity();
312+
let sig = cx.tcx.fn_sig(def_id).instantiate_identity().skip_normalization();
313313
// The generics need to be cleaned before the signature.
314314
let mut generics = clean_ty_generics(cx, def_id);
315315
let bound_vars = clean_bound_vars(sig.bound_vars(), cx.tcx);
@@ -369,7 +369,7 @@ fn build_type_alias(
369369
did: DefId,
370370
ret: &mut Vec<Item>,
371371
) -> Box<clean::TypeAlias> {
372-
let ty = cx.tcx.type_of(did).instantiate_identity();
372+
let ty = cx.tcx.type_of(did).instantiate_identity().skip_normalization();
373373
let type_ = clean_middle_ty(ty::Binder::dummy(ty), cx, Some(did), None);
374374
let inner_type = clean_ty_alias_inner_type(ty, cx, ret);
375375

@@ -488,7 +488,7 @@ pub(crate) fn build_impl(
488488
let for_ = match &impl_item {
489489
Some(impl_) => clean_ty(impl_.self_ty, cx),
490490
None => clean_middle_ty(
491-
ty::Binder::dummy(tcx.type_of(did).instantiate_identity()),
491+
ty::Binder::dummy(tcx.type_of(did).instantiate_identity().skip_normalization()),
492492
cx,
493493
Some(did),
494494
None,
@@ -749,7 +749,7 @@ fn build_const_item(cx: &mut DocContext<'_>, def_id: DefId) -> clean::Constant {
749749
let mut generics = clean_ty_generics(cx, def_id);
750750
clean::simplify::move_bounds_to_generic_parameters(&mut generics);
751751
let ty = clean_middle_ty(
752-
ty::Binder::dummy(cx.tcx.type_of(def_id).instantiate_identity()),
752+
ty::Binder::dummy(cx.tcx.type_of(def_id).instantiate_identity().skip_normalization()),
753753
cx,
754754
None,
755755
None,
@@ -760,7 +760,7 @@ fn build_const_item(cx: &mut DocContext<'_>, def_id: DefId) -> clean::Constant {
760760
fn build_static(cx: &mut DocContext<'_>, did: DefId, mutable: bool) -> clean::Static {
761761
clean::Static {
762762
type_: Box::new(clean_middle_ty(
763-
ty::Binder::dummy(cx.tcx.type_of(did).instantiate_identity()),
763+
ty::Binder::dummy(cx.tcx.type_of(did).instantiate_identity().skip_normalization()),
764764
cx,
765765
Some(did),
766766
None,

src/librustdoc/clean/mod.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use rustc_hir::{LangItem, PredicateOrigin, find_attr};
4646
use rustc_hir_analysis::{lower_const_arg_for_rustdoc, lower_ty};
4747
use rustc_middle::metadata::Reexport;
4848
use rustc_middle::middle::resolve_bound_vars as rbv;
49-
use rustc_middle::ty::{self, AdtKind, GenericArgsRef, Ty, TyCtxt, TypeVisitableExt, TypingMode};
49+
use rustc_middle::ty::{self, AdtKind, GenericArgsRef, Ty, TyCtxt, TypeVisitableExt, TypingMode, Unnormalized};
5050
use rustc_middle::{bug, span_bug};
5151
use rustc_span::ExpnKind;
5252
use rustc_span::hygiene::{AstPass, MacroKind};
@@ -507,7 +507,7 @@ fn clean_hir_term<'tcx>(
507507
hir::Term::Ty(ty) => Term::Type(clean_ty(ty, cx)),
508508
hir::Term::Const(c) => {
509509
// FIXME(generic_const_items): this should instantiate with the alias item's args
510-
let ty = cx.tcx.type_of(assoc_item.unwrap()).instantiate_identity();
510+
let ty = cx.tcx.type_of(assoc_item.unwrap()).instantiate_identity().skip_normalization();
511511
let ct = lower_const_arg_for_rustdoc(cx.tcx, c, ty);
512512
Term::Constant(clean_middle_const(ty::Binder::dummy(ct)))
513513
}
@@ -590,7 +590,7 @@ fn clean_generic_param_def(
590590
&& has_default
591591
{
592592
Some(clean_middle_ty(
593-
ty::Binder::dummy(cx.tcx.type_of(def.def_id).instantiate_identity()),
593+
ty::Binder::dummy(cx.tcx.type_of(def.def_id).instantiate_identity().skip_normalization()),
594594
cx,
595595
Some(def.def_id),
596596
None,
@@ -611,7 +611,7 @@ fn clean_generic_param_def(
611611
def.name,
612612
GenericParamDefKind::Const {
613613
ty: Box::new(clean_middle_ty(
614-
ty::Binder::dummy(cx.tcx.type_of(def.def_id).instantiate_identity()),
614+
ty::Binder::dummy(cx.tcx.type_of(def.def_id).instantiate_identity().skip_normalization()),
615615
cx,
616616
Some(def.def_id),
617617
None,
@@ -620,7 +620,7 @@ fn clean_generic_param_def(
620620
&& has_default
621621
{
622622
Some(Box::new(
623-
cx.tcx.const_param_default(def.def_id).instantiate_identity().to_string(),
623+
cx.tcx.const_param_default(def.def_id).instantiate_identity().skip_normalization().to_string(),
624624
))
625625
} else {
626626
None
@@ -1328,7 +1328,7 @@ pub(crate) fn clean_middle_assoc_item(assoc_item: &ty::AssocItem, cx: &mut DocCo
13281328
let kind = match assoc_item.kind {
13291329
ty::AssocKind::Const { .. } => {
13301330
let ty = clean_middle_ty(
1331-
ty::Binder::dummy(tcx.type_of(assoc_item.def_id).instantiate_identity()),
1331+
ty::Binder::dummy(tcx.type_of(assoc_item.def_id).instantiate_identity().skip_normalization()),
13321332
cx,
13331333
Some(assoc_item.def_id),
13341334
None,
@@ -1364,12 +1364,12 @@ pub(crate) fn clean_middle_assoc_item(assoc_item: &ty::AssocItem, cx: &mut DocCo
13641364
if has_self {
13651365
let self_ty = match assoc_item.container {
13661366
ty::AssocContainer::InherentImpl | ty::AssocContainer::TraitImpl(_) => {
1367-
tcx.type_of(assoc_item.container_id(tcx)).instantiate_identity()
1367+
tcx.type_of(assoc_item.container_id(tcx)).instantiate_identity().skip_normalization()
13681368
}
13691369
ty::AssocContainer::Trait => tcx.types.self_param,
13701370
};
13711371
let self_param_ty =
1372-
tcx.fn_sig(assoc_item.def_id).instantiate_identity().input(0).skip_binder();
1372+
tcx.fn_sig(assoc_item.def_id).instantiate_identity().skip_normalization().input(0).skip_binder();
13731373
if self_param_ty == self_ty {
13741374
item.decl.inputs[0].type_ = SelfTy;
13751375
} else if let ty::Ref(_, ty, _) = *self_param_ty.kind()
@@ -1423,7 +1423,7 @@ pub(crate) fn clean_middle_assoc_item(assoc_item: &ty::AssocItem, cx: &mut DocCo
14231423

14241424
let mut predicates = tcx.explicit_predicates_of(assoc_item.def_id).predicates;
14251425
if let ty::AssocContainer::Trait = assoc_item.container {
1426-
let bounds = tcx.explicit_item_bounds(assoc_item.def_id).iter_identity_copied();
1426+
let bounds = tcx.explicit_item_bounds(assoc_item.def_id).iter_identity_copied().map(Unnormalized::skip_normalization);
14271427
predicates = tcx.arena.alloc_from_iter(bounds.chain(predicates.iter().copied()));
14281428
}
14291429
let mut generics = clean_ty_generics_inner(
@@ -1509,7 +1509,7 @@ pub(crate) fn clean_middle_assoc_item(assoc_item: &ty::AssocItem, cx: &mut DocCo
15091509
Box::new(TypeAlias {
15101510
type_: clean_middle_ty(
15111511
ty::Binder::dummy(
1512-
tcx.type_of(assoc_item.def_id).instantiate_identity(),
1512+
tcx.type_of(assoc_item.def_id).instantiate_identity().skip_normalization(),
15131513
),
15141514
cx,
15151515
Some(assoc_item.def_id),
@@ -1529,7 +1529,7 @@ pub(crate) fn clean_middle_assoc_item(assoc_item: &ty::AssocItem, cx: &mut DocCo
15291529
Box::new(TypeAlias {
15301530
type_: clean_middle_ty(
15311531
ty::Binder::dummy(
1532-
tcx.type_of(assoc_item.def_id).instantiate_identity(),
1532+
tcx.type_of(assoc_item.def_id).instantiate_identity().skip_normalization(),
15331533
),
15341534
cx,
15351535
Some(assoc_item.def_id),
@@ -2267,7 +2267,7 @@ pub(crate) fn clean_middle_ty<'tcx>(
22672267
clean_middle_path(cx, def_id, false, ThinVec::new(), bound_ty.rebind(args));
22682268
Type::Path { path }
22692269
} else {
2270-
let ty = cx.tcx.type_of(def_id).instantiate(cx.tcx, args);
2270+
let ty = cx.tcx.type_of(def_id).instantiate(cx.tcx, args).skip_normalization();
22712271
clean_middle_ty(bound_ty.rebind(ty), cx, None, None)
22722272
}
22732273
}
@@ -2328,8 +2328,7 @@ fn clean_middle_opaque_bounds<'tcx>(
23282328

23292329
let bounds: Vec<_> = cx
23302330
.tcx
2331-
.explicit_item_bounds(impl_trait_def_id)
2332-
.iter_instantiated_copied(cx.tcx, args)
2331+
.explicit_item_bounds(impl_trait_def_id).iter_instantiated_copied(cx.tcx, args).map(Unnormalized::skip_normalization)
23332332
.collect();
23342333

23352334
let mut bounds = bounds
@@ -2427,7 +2426,7 @@ pub(crate) fn clean_middle_field(field: &ty::FieldDef, cx: &mut DocContext<'_>)
24272426
field.did,
24282427
field.name,
24292428
clean_middle_ty(
2430-
ty::Binder::dummy(cx.tcx.type_of(field.did).instantiate_identity()),
2429+
ty::Binder::dummy(cx.tcx.type_of(field.did).instantiate_identity().skip_normalization()),
24312430
cx,
24322431
Some(field.did),
24332432
None,
@@ -2491,7 +2490,7 @@ pub(crate) fn clean_variant_def_with_args<'tcx>(
24912490
.fields
24922491
.iter()
24932492
.map(|field| {
2494-
let ty = cx.tcx.type_of(field.did).instantiate(cx.tcx, args);
2493+
let ty = cx.tcx.type_of(field.did).instantiate(cx.tcx, args).skip_normalization();
24952494

24962495
// normalize the type to only show concrete types
24972496
// note: we do not use try_normalize_erasing_regions since we
@@ -2516,7 +2515,7 @@ pub(crate) fn clean_variant_def_with_args<'tcx>(
25162515
.fields
25172516
.iter()
25182517
.map(|field| {
2519-
let ty = cx.tcx.type_of(field.did).instantiate(cx.tcx, args);
2518+
let ty = cx.tcx.type_of(field.did).instantiate(cx.tcx, args).skip_normalization();
25202519

25212520
// normalize the type to only show concrete types
25222521
// note: we do not use try_normalize_erasing_regions since we
@@ -2860,7 +2859,7 @@ fn clean_maybe_renamed_item<'tcx>(
28602859
}
28612860
}
28622861

2863-
let ty = cx.tcx.type_of(def_id).instantiate_identity();
2862+
let ty = cx.tcx.type_of(def_id).instantiate_identity().skip_normalization();
28642863

28652864
let mut ret = Vec::new();
28662865
let inner_type = clean_ty_alias_inner_type(ty, cx, &mut ret);
@@ -2992,7 +2991,7 @@ fn clean_impl<'tcx>(
29922991
let type_alias =
29932992
for_.def_id(&cx.cache).and_then(|alias_def_id: DefId| match tcx.def_kind(alias_def_id) {
29942993
DefKind::TyAlias => Some(clean_middle_ty(
2995-
ty::Binder::dummy(tcx.type_of(def_id).instantiate_identity()),
2994+
ty::Binder::dummy(tcx.type_of(def_id).instantiate_identity().skip_normalization()),
29962995
cx,
29972996
Some(def_id.to_def_id()),
29982997
None,

src/librustdoc/clean/simplify.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc_data_structures::fx::FxIndexMap;
1515
use rustc_data_structures::thin_vec::ThinVec;
1616
use rustc_data_structures::unord::UnordSet;
1717
use rustc_hir::def_id::DefId;
18-
use rustc_middle::ty::TyCtxt;
18+
use rustc_middle::ty::{TyCtxt, Unnormalized};
1919

2020
use crate::clean;
2121
use crate::clean::{GenericArgs as PP, WherePredicate as WP};
@@ -114,8 +114,7 @@ fn trait_is_same_or_supertrait(tcx: TyCtxt<'_>, child: DefId, trait_: DefId) ->
114114
return true;
115115
}
116116
let predicates = tcx.explicit_super_predicates_of(child);
117-
predicates
118-
.iter_identity_copied()
117+
predicates.iter_identity_copied().map(Unnormalized::skip_normalization)
119118
.filter_map(|(pred, _)| Some(pred.as_trait_clause()?.def_id()))
120119
.any(|did| trait_is_same_or_supertrait(tcx, did, trait_))
121120
}

src/librustdoc/clean/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ pub(crate) fn clean_middle_generic_args<'tcx>(
126126

127127
// Elide arguments that coincide with their default.
128128
if !elision_has_failed_once_before && let Some(default) = param.default_value(cx.tcx) {
129-
let default = default.instantiate(cx.tcx, args.as_ref());
129+
let default = default.instantiate(cx.tcx, args.as_ref()).skip_normalization();
130130
if can_elide_generic_arg(arg, arg.rebind(default)) {
131131
return None;
132132
}
@@ -371,7 +371,7 @@ pub(crate) fn print_evaluated_const(
371371
with_type: bool,
372372
) -> Option<String> {
373373
tcx.const_eval_poly(def_id).ok().and_then(|val| {
374-
let ty = tcx.type_of(def_id).instantiate_identity();
374+
let ty = tcx.type_of(def_id).instantiate_identity().skip_normalization();
375375
match (val, ty.kind()) {
376376
(_, &ty::Ref(..)) => None,
377377
(mir::ConstValue::Scalar(_), &ty::Adt(_, _)) => None,

src/librustdoc/formats/cache.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ impl DocFolder for CacheBuilder<'_, '_> {
425425
dids.insert(path.def_id());
426426
if let Some(generics) = path.generics()
427427
&& let ty::Adt(adt, _) =
428-
self.tcx.type_of(path.def_id()).instantiate_identity().kind()
428+
self.tcx.type_of(path.def_id()).instantiate_identity().skip_normalization().kind()
429429
&& adt.is_fundamental()
430430
{
431431
for ty in generics {

src/librustdoc/html/format.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ fn generate_item_def_id_path(
441441
let infcx = tcx.infer_ctxt().build(TypingMode::non_body_analysis());
442442
def_id = infcx
443443
.at(&ObligationCause::dummy(), tcx.param_env(def_id))
444-
.query_normalize(ty::Binder::dummy(tcx.type_of(def_id).instantiate_identity()))
444+
.query_normalize(ty::Binder::dummy(tcx.type_of(def_id).instantiate_identity().skip_normalization()))
445445
.map(|resolved| infcx.resolve_vars_if_possible(resolved.value))
446446
.ok()
447447
.and_then(|normalized| normalized.skip_binder().ty_adt_def())

src/librustdoc/html/render/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2995,7 +2995,7 @@ fn repr_attribute<'tcx>(
29952995
// Side note: There can only ever be one or zero non-1-ZST fields.
29962996
let non_1zst_field = var.fields.iter().find(|field| {
29972997
let ty = ty::TypingEnv::post_analysis(tcx, field.did)
2998-
.as_query_input(tcx.type_of(field.did).instantiate_identity());
2998+
.as_query_input(tcx.type_of(field.did).instantiate_identity().skip_normalization());
29992999
tcx.layout_of(ty).is_ok_and(|layout| !layout.is_1zst())
30003000
});
30013001

src/librustdoc/html/render/print_item.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,7 +1275,7 @@ fn item_type_alias(cx: &Context<'_>, it: &clean::Item, t: &clean::TypeAlias) ->
12751275

12761276
match inner_type {
12771277
clean::TypeAliasInnerType::Enum { variants, is_non_exhaustive } => {
1278-
let ty = cx.tcx().type_of(it.def_id().unwrap()).instantiate_identity();
1278+
let ty = cx.tcx().type_of(it.def_id().unwrap()).instantiate_identity().skip_normalization();
12791279
let enum_def_id = ty.ty_adt_def().unwrap().did();
12801280

12811281
DisplayEnum {
@@ -1287,7 +1287,7 @@ fn item_type_alias(cx: &Context<'_>, it: &clean::Item, t: &clean::TypeAlias) ->
12871287
.render_into(cx, it, true, w)?;
12881288
}
12891289
clean::TypeAliasInnerType::Union { fields } => {
1290-
let ty = cx.tcx().type_of(it.def_id().unwrap()).instantiate_identity();
1290+
let ty = cx.tcx().type_of(it.def_id().unwrap()).instantiate_identity().skip_normalization();
12911291
let union_def_id = ty.ty_adt_def().unwrap().did();
12921292

12931293
ItemUnion {
@@ -1301,7 +1301,7 @@ fn item_type_alias(cx: &Context<'_>, it: &clean::Item, t: &clean::TypeAlias) ->
13011301
.render_into(w)?;
13021302
}
13031303
clean::TypeAliasInnerType::Struct { ctor_kind, fields } => {
1304-
let ty = cx.tcx().type_of(it.def_id().unwrap()).instantiate_identity();
1304+
let ty = cx.tcx().type_of(it.def_id().unwrap()).instantiate_identity().skip_normalization();
13051305
let struct_def_id = ty.ty_adt_def().unwrap().did();
13061306

13071307
DisplayStruct {

0 commit comments

Comments
 (0)