]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_mir/src/monomorphize/mod.rs
Auto merge of #86335 - CDirkx:ipv4-in-ipv6, r=dtolnay
[rust.git] / compiler / rustc_mir / src / monomorphize / mod.rs
1 use rustc_middle::traits;
2 use rustc_middle::ty::adjustment::CustomCoerceUnsized;
3 use rustc_middle::ty::{self, Ty, TyCtxt};
4
5 use rustc_hir::lang_items::LangItem;
6
7 pub mod collector;
8 pub mod partitioning;
9 pub mod polymorphize;
10 pub mod util;
11
12 fn custom_coerce_unsize_info<'tcx>(
13     tcx: TyCtxt<'tcx>,
14     source_ty: Ty<'tcx>,
15     target_ty: Ty<'tcx>,
16 ) -> CustomCoerceUnsized {
17     let def_id = tcx.require_lang_item(LangItem::CoerceUnsized, None);
18
19     let trait_ref = ty::Binder::dummy(ty::TraitRef {
20         def_id,
21         substs: tcx.mk_substs_trait(source_ty, &[target_ty.into()]),
22     });
23
24     match tcx.codegen_fulfill_obligation((ty::ParamEnv::reveal_all(), trait_ref)) {
25         Ok(traits::ImplSource::UserDefined(traits::ImplSourceUserDefinedData {
26             impl_def_id,
27             ..
28         })) => tcx.coerce_unsized_info(impl_def_id).custom_kind.unwrap(),
29         impl_source => {
30             bug!("invalid `CoerceUnsized` impl_source: {:?}", impl_source);
31         }
32     }
33 }