]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_ty_utils/src/implied_bounds.rs
Rollup merge of #105681 - tshepang:doc-mir-visit, r=Nilstrieb
[rust.git] / compiler / rustc_ty_utils / src / implied_bounds.rs
1 use crate::rustc_middle::ty::DefIdTree;
2 use rustc_hir::{def::DefKind, def_id::DefId};
3 use rustc_middle::ty::{self, Ty, TyCtxt};
4
5 pub fn provide(providers: &mut ty::query::Providers) {
6     *providers = ty::query::Providers { assumed_wf_types, ..*providers };
7 }
8
9 fn assumed_wf_types(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::List<Ty<'_>> {
10     match tcx.def_kind(def_id) {
11         DefKind::Fn => {
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
15         }
16         DefKind::AssocFn => {
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)
23         }
24         DefKind::Impl => match tcx.impl_trait_ref(def_id) {
25             Some(trait_ref) => {
26                 let types: Vec<_> = trait_ref.substs.types().collect();
27                 tcx.intern_type_list(&types)
28             }
29             // Only the impl self type
30             None => tcx.intern_type_list(&[tcx.type_of(def_id)]),
31         },
32         DefKind::AssocConst | DefKind::AssocTy => tcx.assumed_wf_types(tcx.parent(def_id)),
33         DefKind::Mod
34         | DefKind::Struct
35         | DefKind::Union
36         | DefKind::Enum
37         | DefKind::Variant
38         | DefKind::Trait
39         | DefKind::TyAlias
40         | DefKind::ForeignTy
41         | DefKind::TraitAlias
42         | DefKind::TyParam
43         | DefKind::Const
44         | DefKind::ConstParam
45         | DefKind::Static(_)
46         | DefKind::Ctor(_, _)
47         | DefKind::Macro(_)
48         | DefKind::ExternCrate
49         | DefKind::Use
50         | DefKind::ForeignMod
51         | DefKind::AnonConst
52         | DefKind::InlineConst
53         | DefKind::OpaqueTy
54         | DefKind::ImplTraitPlaceholder
55         | DefKind::Field
56         | DefKind::LifetimeParam
57         | DefKind::GlobalAsm
58         | DefKind::Closure
59         | DefKind::Generator => ty::List::empty(),
60     }
61 }