1 use crate::rustc_middle::ty::DefIdTree;
2 use rustc_hir::{def::DefKind, def_id::DefId};
3 use rustc_middle::ty::{self, Ty, TyCtxt};
5 pub fn provide(providers: &mut ty::query::Providers) {
6 *providers = ty::query::Providers { assumed_wf_types, ..*providers };
9 fn assumed_wf_types<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx ty::List<Ty<'tcx>> {
10 match tcx.def_kind(def_id) {
12 let sig = tcx.fn_sig(def_id);
13 let liberated_sig = tcx.liberate_late_bound_regions(def_id, sig);
14 liberated_sig.inputs_and_output
17 let sig = tcx.fn_sig(def_id);
18 let liberated_sig = tcx.liberate_late_bound_regions(def_id, sig);
19 let mut assumed_wf_types: Vec<_> =
20 tcx.assumed_wf_types(tcx.parent(def_id)).as_slice().into();
21 assumed_wf_types.extend(liberated_sig.inputs_and_output);
22 tcx.intern_type_list(&assumed_wf_types)
24 DefKind::Impl => match tcx.impl_trait_ref(def_id) {
26 let types: Vec<_> = trait_ref.substs.types().collect();
27 tcx.intern_type_list(&types)
29 // Only the impl self type
30 None => tcx.intern_type_list(&[tcx.type_of(def_id)]),
32 DefKind::AssocConst | DefKind::AssocTy => tcx.assumed_wf_types(tcx.parent(def_id)),
48 | DefKind::ExternCrate
52 | DefKind::InlineConst
54 | DefKind::ImplTraitPlaceholder
56 | DefKind::LifetimeParam
59 | DefKind::Generator => ty::List::empty(),