]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_monomorphize/src/lib.rs
New upstream version 1.66.0+dfsg1
[rustc.git] / compiler / rustc_monomorphize / src / lib.rs
CommitLineData
c295e0f8 1#![feature(array_windows)]
c295e0f8 2#![feature(control_flow_enum)]
c295e0f8 3#![recursion_limit = "256"]
5e7ed085 4#![allow(rustc::potential_query_instability)]
f2b60f7d
FG
5#![deny(rustc::untranslatable_diagnostic)]
6#![deny(rustc::diagnostic_outside_of_impl)]
c295e0f8
XL
7
8#[macro_use]
9extern crate tracing;
10#[macro_use]
11extern crate rustc_middle;
12
13use rustc_hir::lang_items::LangItem;
ba9703b0
XL
14use rustc_middle::traits;
15use rustc_middle::ty::adjustment::CustomCoerceUnsized;
c295e0f8 16use rustc_middle::ty::query::Providers;
ba9703b0 17use rustc_middle::ty::{self, Ty, TyCtxt};
32a655c1 18
c295e0f8 19mod collector;
f2b60f7d 20mod errors;
c295e0f8
XL
21mod partitioning;
22mod polymorphize;
23mod util;
cc61c64b 24
cdc7bbd5 25fn custom_coerce_unsize_info<'tcx>(
dc9dc135
XL
26 tcx: TyCtxt<'tcx>,
27 source_ty: Ty<'tcx>,
28 target_ty: Ty<'tcx>,
29) -> CustomCoerceUnsized {
3dfed10e 30 let def_id = tcx.require_lang_item(LangItem::CoerceUnsized, None);
abe05a73 31
cdc7bbd5 32 let trait_ref = ty::Binder::dummy(ty::TraitRef {
74b04a01 33 def_id,
dfeec247 34 substs: tcx.mk_substs_trait(source_ty, &[target_ty.into()]),
cc61c64b
XL
35 });
36
f2b60f7d 37 match tcx.codegen_select_candidate((ty::ParamEnv::reveal_all(), trait_ref)) {
1b1a35ee 38 Ok(traits::ImplSource::UserDefined(traits::ImplSourceUserDefinedData {
f035d41b
XL
39 impl_def_id,
40 ..
41 })) => tcx.coerce_unsized_info(impl_def_id).custom_kind.unwrap(),
42 impl_source => {
43 bug!("invalid `CoerceUnsized` impl_source: {:?}", impl_source);
cc61c64b
XL
44 }
45 }
46}
c295e0f8
XL
47
48pub fn provide(providers: &mut Providers) {
49 partitioning::provide(providers);
50 polymorphize::provide(providers);
51}