rustc_ty_utils/
common_traits.rs1use 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_use_cloned_raw<'tcx>(
14 tcx: TyCtxt<'tcx>,
15 query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>,
16) -> bool {
17 is_item_raw(tcx, query, LangItem::UseCloned)
18}
19
20fn is_sized_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> bool {
21 is_item_raw(tcx, query, LangItem::Sized)
22}
23
24fn is_freeze_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> bool {
25 is_item_raw(tcx, query, LangItem::Freeze)
26}
27
28fn is_unpin_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> bool {
29 is_item_raw(tcx, query, LangItem::Unpin)
30}
31
32fn is_async_drop_raw<'tcx>(
33 tcx: TyCtxt<'tcx>,
34 query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>,
35) -> bool {
36 is_item_raw(tcx, query, LangItem::AsyncDrop)
37}
38
39fn is_item_raw<'tcx>(
40 tcx: TyCtxt<'tcx>,
41 query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>,
42 item: LangItem,
43) -> bool {
44 let (infcx, param_env) = tcx.infer_ctxt().build_with_typing_env(query.typing_env);
45 let trait_def_id = tcx.require_lang_item(item, None);
46 traits::type_known_to_meet_bound_modulo_regions(&infcx, param_env, query.value, trait_def_id)
47}
48
49pub(crate) fn provide(providers: &mut Providers) {
50 *providers = Providers {
51 is_copy_raw,
52 is_use_cloned_raw,
53 is_sized_raw,
54 is_freeze_raw,
55 is_unpin_raw,
56 is_async_drop_raw,
57 ..*providers
58 };
59}