rustc_ty_utils/
common_traits.rs
1use rustc_hir::lang_items::LangItem;
4use rustc_infer::infer::TyCtxtInferExt;
5use rustc_middle::query::Providers;
6use rustc_middle::ty::{self, Ty, TyCtxt};
7use rustc_trait_selection::traits;
8
9fn is_copy_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> bool {
10 is_item_raw(tcx, query, LangItem::Copy)
11}
12
13fn is_sized_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> bool {
14 is_item_raw(tcx, query, LangItem::Sized)
15}
16
17fn is_freeze_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> bool {
18 is_item_raw(tcx, query, LangItem::Freeze)
19}
20
21fn is_unpin_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> bool {
22 is_item_raw(tcx, query, LangItem::Unpin)
23}
24
25fn is_item_raw<'tcx>(
26 tcx: TyCtxt<'tcx>,
27 query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>,
28 item: LangItem,
29) -> bool {
30 let (infcx, param_env) = tcx.infer_ctxt().build_with_typing_env(query.typing_env);
31 let trait_def_id = tcx.require_lang_item(item, None);
32 traits::type_known_to_meet_bound_modulo_regions(&infcx, param_env, query.value, trait_def_id)
33}
34
35pub(crate) fn provide(providers: &mut Providers) {
36 *providers = Providers { is_copy_raw, is_sized_raw, is_freeze_raw, is_unpin_raw, ..*providers };
37}