1 #![feature(array_windows)]
2 #![feature(control_flow_enum)]
3 #![recursion_limit = "256"]
4 #![allow(rustc::potential_query_instability)]
5 #![deny(rustc::untranslatable_diagnostic)]
6 #![deny(rustc::diagnostic_outside_of_impl)]
11 extern crate rustc_middle
;
13 use rustc_hir
::lang_items
::LangItem
;
14 use rustc_middle
::traits
;
15 use rustc_middle
::ty
::adjustment
::CustomCoerceUnsized
;
16 use rustc_middle
::ty
::query
::Providers
;
17 use rustc_middle
::ty
::{self, Ty, TyCtxt}
;
25 fn custom_coerce_unsize_info
<'tcx
>(
29 ) -> CustomCoerceUnsized
{
30 let def_id
= tcx
.require_lang_item(LangItem
::CoerceUnsized
, None
);
32 let trait_ref
= ty
::Binder
::dummy(ty
::TraitRef
{
34 substs
: tcx
.mk_substs_trait(source_ty
, &[target_ty
.into()]),
37 match tcx
.codegen_select_candidate((ty
::ParamEnv
::reveal_all(), trait_ref
)) {
38 Ok(traits
::ImplSource
::UserDefined(traits
::ImplSourceUserDefinedData
{
41 })) => tcx
.coerce_unsized_info(impl_def_id
).custom_kind
.unwrap(),
43 bug
!("invalid `CoerceUnsized` impl_source: {:?}", impl_source
);
48 pub fn provide(providers
: &mut Providers
) {
49 partitioning
::provide(providers
);
50 polymorphize
::provide(providers
);