| // tidy-alphabetical-start | |
| #![feature(file_buffered)] | |
| #![feature(impl_trait_in_assoc_type)] | |
| #![feature(once_cell_get_mut)] | |
| // tidy-alphabetical-end | |
| use rustc_hir::lang_items::LangItem; | |
| use rustc_middle::query::TyCtxtAt; | |
| use rustc_middle::ty::adjustment::CustomCoerceUnsized; | |
| use rustc_middle::ty::{self, Ty}; | |
| use rustc_middle::util::Providers; | |
| use rustc_middle::{bug, traits}; | |
| use rustc_span::ErrorGuaranteed; | |
| mod collector; | |
| mod errors; | |
| mod graph_checks; | |
| mod mono_checks; | |
| mod partitioning; | |
| mod util; | |
| fn custom_coerce_unsize_info<'tcx>( | |
| tcx: TyCtxtAt<'tcx>, | |
| source_ty: Ty<'tcx>, | |
| target_ty: Ty<'tcx>, | |
| ) -> Result<CustomCoerceUnsized, ErrorGuaranteed> { | |
| let trait_ref = ty::TraitRef::new( | |
| tcx.tcx, | |
| tcx.require_lang_item(LangItem::CoerceUnsized, tcx.span), | |
| [source_ty, target_ty], | |
| ); | |
| match tcx | |
| .codegen_select_candidate(ty::TypingEnv::fully_monomorphized().as_query_input(trait_ref)) | |
| { | |
| Ok(traits::ImplSource::UserDefined(traits::ImplSourceUserDefinedData { | |
| impl_def_id, | |
| .. | |
| })) => Ok(tcx.coerce_unsized_info(*impl_def_id)?.custom_kind.unwrap()), | |
| impl_source => { | |
| bug!( | |
| "invalid `CoerceUnsized` from {source_ty} to {target_ty}: impl_source: {:?}", | |
| impl_source | |
| ); | |
| } | |
| } | |
| } | |
| pub fn provide(providers: &mut Providers) { | |
| partitioning::provide(providers); | |
| mono_checks::provide(&mut providers.queries); | |
| } |