]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_ty_utils/src/implied_bounds.rs
Rollup merge of #105784 - yanns:update_stdarch, r=Amanieu
[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 => {
25             match tcx.impl_trait_ref(def_id) {
26                 Some(trait_ref) => {
27                     let types: Vec<_> = trait_ref.skip_binder().substs.types().collect();
28                     tcx.intern_type_list(&types)
29                 }
30                 // Only the impl self type
31                 None => tcx.intern_type_list(&[tcx.type_of(def_id)]),
32             }
33         }
34         DefKind::AssocConst | DefKind::AssocTy => tcx.assumed_wf_types(tcx.parent(def_id)),
35         DefKind::Mod
36         | DefKind::Struct
37         | DefKind::Union
38         | DefKind::Enum
39         | DefKind::Variant
40         | DefKind::Trait
41         | DefKind::TyAlias
42         | DefKind::ForeignTy
43         | DefKind::TraitAlias
44         | DefKind::TyParam
45         | DefKind::Const
46         | DefKind::ConstParam
47         | DefKind::Static(_)
48         | DefKind::Ctor(_, _)
49         | DefKind::Macro(_)
50         | DefKind::ExternCrate
51         | DefKind::Use
52         | DefKind::ForeignMod
53         | DefKind::AnonConst
54         | DefKind::InlineConst
55         | DefKind::OpaqueTy
56         | DefKind::ImplTraitPlaceholder
57         | DefKind::Field
58         | DefKind::LifetimeParam
59         | DefKind::GlobalAsm
60         | DefKind::Closure
61         | DefKind::Generator => ty::List::empty(),
62     }
63 }