]>
Commit | Line | Data |
---|---|---|
c295e0f8 XL |
1 | #![feature(array_windows)] |
2 | #![feature(bool_to_option)] | |
3 | #![feature(crate_visibility_modifier)] | |
4 | #![feature(control_flow_enum)] | |
3c0e092e | 5 | #![feature(let_else)] |
c295e0f8 | 6 | #![recursion_limit = "256"] |
5e7ed085 | 7 | #![allow(rustc::potential_query_instability)] |
c295e0f8 XL |
8 | |
9 | #[macro_use] | |
10 | extern crate tracing; | |
11 | #[macro_use] | |
12 | extern crate rustc_middle; | |
13 | ||
14 | use rustc_hir::lang_items::LangItem; | |
ba9703b0 XL |
15 | use rustc_middle::traits; |
16 | use rustc_middle::ty::adjustment::CustomCoerceUnsized; | |
c295e0f8 | 17 | use rustc_middle::ty::query::Providers; |
ba9703b0 | 18 | use rustc_middle::ty::{self, Ty, TyCtxt}; |
32a655c1 | 19 | |
c295e0f8 XL |
20 | mod collector; |
21 | mod partitioning; | |
22 | mod polymorphize; | |
23 | mod util; | |
cc61c64b | 24 | |
cdc7bbd5 | 25 | fn 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 | ||
dfeec247 | 37 | match tcx.codegen_fulfill_obligation((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 | |
48 | pub fn provide(providers: &mut Providers) { | |
49 | partitioning::provide(providers); | |
50 | polymorphize::provide(providers); | |
51 | } |