Skip to main content

rustc_middle/ty/context/
impl_interner.rs

1//! Implementation of [`rustc_type_ir::Interner`] for [`TyCtxt`].
2
3use std::{debug_assert_matches, fmt};
4
5use rustc_abi::ExternAbi;
6use rustc_errors::ErrorGuaranteed;
7use rustc_hir as hir;
8use rustc_hir::def::{CtorKind, CtorOf, DefKind};
9use rustc_hir::def_id::{DefId, LocalDefId};
10use rustc_hir::lang_items::LangItem;
11use rustc_span::{DUMMY_SP, Span, Symbol};
12use rustc_type_ir::lang_items::{SolverAdtLangItem, SolverLangItem, SolverTraitLangItem};
13use rustc_type_ir::{CollectAndApply, Interner, TypeFoldable, search_graph};
14
15use crate::dep_graph::{DepKind, DepNodeIndex};
16use crate::infer::canonical::CanonicalVarKinds;
17use crate::traits::cache::WithDepNode;
18use crate::traits::solve::{
19    self, CanonicalInput, ExternalConstraints, ExternalConstraintsData, QueryResult, inspect,
20};
21use crate::ty::{
22    self, Clause, Const, List, ParamTy, Pattern, PolyExistentialPredicate, Predicate, Region, Ty,
23    TyCtxt,
24};
25
26#[allow(rustc::usage_of_ty_tykind)]
27impl<'tcx> Interner for TyCtxt<'tcx> {
28    fn next_trait_solver_globally(self) -> bool {
29        self.next_trait_solver_globally()
30    }
31
32    type DefId = DefId;
33    type LocalDefId = LocalDefId;
34    type TraitId = DefId;
35    type ForeignId = DefId;
36    type FunctionId = DefId;
37    type ClosureId = DefId;
38    type CoroutineClosureId = DefId;
39    type CoroutineId = DefId;
40    type AdtId = DefId;
41    type ImplId = DefId;
42    type UnevaluatedConstId = DefId;
43    type Span = Span;
44
45    type GenericArgs = ty::GenericArgsRef<'tcx>;
46
47    type GenericArgsSlice = &'tcx [ty::GenericArg<'tcx>];
48    type GenericArg = ty::GenericArg<'tcx>;
49    type Term = ty::Term<'tcx>;
50    type BoundVarKinds = &'tcx List<ty::BoundVariableKind<'tcx>>;
51
52    type PredefinedOpaques = solve::PredefinedOpaques<'tcx>;
53
54    fn mk_predefined_opaques_in_body(
55        self,
56        data: &[(ty::OpaqueTypeKey<'tcx>, Ty<'tcx>)],
57    ) -> Self::PredefinedOpaques {
58        self.mk_predefined_opaques_in_body(data)
59    }
60    type LocalDefIds = &'tcx ty::List<LocalDefId>;
61    type CanonicalVarKinds = CanonicalVarKinds<'tcx>;
62    fn mk_canonical_var_kinds(
63        self,
64        kinds: &[ty::CanonicalVarKind<Self>],
65    ) -> Self::CanonicalVarKinds {
66        self.mk_canonical_var_kinds(kinds)
67    }
68
69    type ExternalConstraints = ExternalConstraints<'tcx>;
70    fn mk_external_constraints(
71        self,
72        data: ExternalConstraintsData<Self>,
73    ) -> ExternalConstraints<'tcx> {
74        self.mk_external_constraints(data)
75    }
76    type DepNodeIndex = DepNodeIndex;
77    fn with_cached_task<T>(self, task: impl FnOnce() -> T) -> (T, DepNodeIndex) {
78        self.dep_graph.with_anon_task(self, DepKind::TraitSelect, task)
79    }
80    type Ty = Ty<'tcx>;
81    type Tys = &'tcx List<Ty<'tcx>>;
82
83    type FnInputTys = &'tcx [Ty<'tcx>];
84    type ParamTy = ParamTy;
85    type Symbol = Symbol;
86
87    type ErrorGuaranteed = ErrorGuaranteed;
88    type BoundExistentialPredicates = &'tcx List<PolyExistentialPredicate<'tcx>>;
89
90    type AllocId = crate::mir::interpret::AllocId;
91    type Pat = Pattern<'tcx>;
92    type PatList = &'tcx List<Pattern<'tcx>>;
93    type Safety = hir::Safety;
94    type Abi = ExternAbi;
95    type Const = ty::Const<'tcx>;
96    type Consts = &'tcx List<Self::Const>;
97
98    type ParamConst = ty::ParamConst;
99    type ValueConst = ty::Value<'tcx>;
100    type ExprConst = ty::Expr<'tcx>;
101    type ValTree = ty::ValTree<'tcx>;
102    type ScalarInt = ty::ScalarInt;
103
104    type Region = Region<'tcx>;
105    type EarlyParamRegion = ty::EarlyParamRegion;
106    type LateParamRegion = ty::LateParamRegion;
107
108    type RegionAssumptions = &'tcx ty::List<ty::ArgOutlivesPredicate<'tcx>>;
109
110    type ParamEnv = ty::ParamEnv<'tcx>;
111    type Predicate = Predicate<'tcx>;
112
113    type Clause = Clause<'tcx>;
114    type Clauses = ty::Clauses<'tcx>;
115
116    type Tracked<T: fmt::Debug + Clone> = WithDepNode<T>;
117    fn mk_tracked<T: fmt::Debug + Clone>(
118        self,
119        data: T,
120        dep_node: DepNodeIndex,
121    ) -> Self::Tracked<T> {
122        WithDepNode::new(dep_node, data)
123    }
124    fn get_tracked<T: fmt::Debug + Clone>(self, tracked: &Self::Tracked<T>) -> T {
125        tracked.get(self)
126    }
127
128    fn with_global_cache<R>(self, f: impl FnOnce(&mut search_graph::GlobalCache<Self>) -> R) -> R {
129        f(&mut *self.new_solver_evaluation_cache.lock())
130    }
131
132    fn canonical_param_env_cache_get_or_insert<R>(
133        self,
134        param_env: ty::ParamEnv<'tcx>,
135        f: impl FnOnce() -> ty::CanonicalParamEnvCacheEntry<Self>,
136        from_entry: impl FnOnce(&ty::CanonicalParamEnvCacheEntry<Self>) -> R,
137    ) -> R {
138        let mut cache = self.new_solver_canonical_param_env_cache.lock();
139        let entry = cache.entry(param_env).or_insert_with(f);
140        from_entry(entry)
141    }
142
143    fn assert_evaluation_is_concurrent(&self) {
144        // Turns out, the assumption for this function isn't perfect.
145        // See trait-system-refactor-initiative#234.
146    }
147
148    fn expand_abstract_consts<T: TypeFoldable<TyCtxt<'tcx>>>(self, t: T) -> T {
149        self.expand_abstract_consts(t)
150    }
151
152    type GenericsOf = &'tcx ty::Generics;
153
154    fn generics_of(self, def_id: DefId) -> &'tcx ty::Generics {
155        self.generics_of(def_id)
156    }
157
158    type VariancesOf = &'tcx [ty::Variance];
159
160    fn variances_of(self, def_id: DefId) -> Self::VariancesOf {
161        self.variances_of(def_id)
162    }
163
164    fn opt_alias_variances(
165        self,
166        kind: impl Into<ty::AliasTermKind>,
167        def_id: DefId,
168    ) -> Option<&'tcx [ty::Variance]> {
169        self.opt_alias_variances(kind, def_id)
170    }
171
172    fn type_of(self, def_id: DefId) -> ty::EarlyBinder<'tcx, Ty<'tcx>> {
173        self.type_of(def_id)
174    }
175    fn type_of_opaque_hir_typeck(self, def_id: LocalDefId) -> ty::EarlyBinder<'tcx, Ty<'tcx>> {
176        self.type_of_opaque_hir_typeck(def_id)
177    }
178    fn const_of_item(self, def_id: DefId) -> ty::EarlyBinder<'tcx, Const<'tcx>> {
179        self.const_of_item(def_id)
180    }
181    fn anon_const_kind(self, def_id: DefId) -> ty::AnonConstKind {
182        self.anon_const_kind(def_id)
183    }
184
185    type AdtDef = ty::AdtDef<'tcx>;
186    fn adt_def(self, adt_def_id: DefId) -> Self::AdtDef {
187        self.adt_def(adt_def_id)
188    }
189
190    fn alias_ty_kind(self, alias: ty::AliasTy<'tcx>) -> ty::AliasTyKind {
191        match self.def_kind(alias.def_id) {
192            DefKind::AssocTy => {
193                if let DefKind::Impl { of_trait: false } = self.def_kind(self.parent(alias.def_id))
194                {
195                    ty::Inherent
196                } else {
197                    ty::Projection
198                }
199            }
200            DefKind::OpaqueTy => ty::Opaque,
201            DefKind::TyAlias => ty::Free,
202            kind => crate::util::bug::bug_fmt(format_args!("unexpected DefKind in AliasTy: {0:?}",
        kind))bug!("unexpected DefKind in AliasTy: {kind:?}"),
203        }
204    }
205
206    fn alias_term_kind(self, alias: ty::AliasTerm<'tcx>) -> ty::AliasTermKind {
207        match self.def_kind(alias.def_id) {
208            DefKind::AssocTy => {
209                if let DefKind::Impl { of_trait: false } = self.def_kind(self.parent(alias.def_id))
210                {
211                    ty::AliasTermKind::InherentTy
212                } else {
213                    ty::AliasTermKind::ProjectionTy
214                }
215            }
216            DefKind::AssocConst { .. } => {
217                if let DefKind::Impl { of_trait: false } = self.def_kind(self.parent(alias.def_id))
218                {
219                    ty::AliasTermKind::InherentConst
220                } else {
221                    ty::AliasTermKind::ProjectionConst
222                }
223            }
224            DefKind::OpaqueTy => ty::AliasTermKind::OpaqueTy,
225            DefKind::TyAlias => ty::AliasTermKind::FreeTy,
226            DefKind::Const { .. } => ty::AliasTermKind::FreeConst,
227            DefKind::AnonConst | DefKind::Ctor(_, CtorKind::Const) => {
228                ty::AliasTermKind::UnevaluatedConst
229            }
230            kind => crate::util::bug::bug_fmt(format_args!("unexpected DefKind in AliasTy: {0:?}",
        kind))bug!("unexpected DefKind in AliasTy: {kind:?}"),
231        }
232    }
233
234    fn trait_ref_and_own_args_for_alias(
235        self,
236        def_id: DefId,
237        args: ty::GenericArgsRef<'tcx>,
238    ) -> (ty::TraitRef<'tcx>, &'tcx [ty::GenericArg<'tcx>]) {
239        if true {
    match self.def_kind(def_id) {
        DefKind::AssocTy | DefKind::AssocConst { .. } => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "DefKind::AssocTy | DefKind::AssocConst { .. }",
                ::core::option::Option::None);
        }
    };
};debug_assert_matches!(self.def_kind(def_id), DefKind::AssocTy | DefKind::AssocConst { .. });
240        let trait_def_id = self.parent(def_id);
241        if true {
    match self.def_kind(trait_def_id) {
        DefKind::Trait => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "DefKind::Trait", ::core::option::Option::None);
        }
    };
};debug_assert_matches!(self.def_kind(trait_def_id), DefKind::Trait);
242        let trait_ref = ty::TraitRef::from_assoc(self, trait_def_id, args);
243        (trait_ref, &args[trait_ref.args.len()..])
244    }
245
246    fn mk_args(self, args: &[Self::GenericArg]) -> ty::GenericArgsRef<'tcx> {
247        self.mk_args(args)
248    }
249
250    fn mk_args_from_iter<I, T>(self, args: I) -> T::Output
251    where
252        I: Iterator<Item = T>,
253        T: CollectAndApply<Self::GenericArg, ty::GenericArgsRef<'tcx>>,
254    {
255        self.mk_args_from_iter(args)
256    }
257
258    fn check_args_compatible(self, def_id: DefId, args: ty::GenericArgsRef<'tcx>) -> bool {
259        self.check_args_compatible(def_id, args)
260    }
261
262    fn debug_assert_args_compatible(self, def_id: DefId, args: ty::GenericArgsRef<'tcx>) {
263        self.debug_assert_args_compatible(def_id, args);
264    }
265
266    /// Assert that the args from an `ExistentialTraitRef` or `ExistentialProjection`
267    /// are compatible with the `DefId`. Since we're missing a `Self` type, stick on
268    /// a dummy self type and forward to `debug_assert_args_compatible`.
269    fn debug_assert_existential_args_compatible(
270        self,
271        def_id: Self::DefId,
272        args: Self::GenericArgs,
273    ) {
274        // FIXME: We could perhaps add a `skip: usize` to `debug_assert_args_compatible`
275        // to avoid needing to reintern the set of args...
276        if truecfg!(debug_assertions) {
277            self.debug_assert_args_compatible(
278                def_id,
279                self.mk_args_from_iter(
280                    [self.types.trait_object_dummy_self.into()].into_iter().chain(args.iter()),
281                ),
282            );
283        }
284    }
285
286    fn mk_type_list_from_iter<I, T>(self, args: I) -> T::Output
287    where
288        I: Iterator<Item = T>,
289        T: CollectAndApply<Ty<'tcx>, &'tcx List<Ty<'tcx>>>,
290    {
291        self.mk_type_list_from_iter(args)
292    }
293
294    fn parent(self, def_id: DefId) -> DefId {
295        self.parent(def_id)
296    }
297
298    fn recursion_limit(self) -> usize {
299        self.recursion_limit().0
300    }
301
302    type Features = &'tcx rustc_feature::Features;
303
304    fn features(self) -> Self::Features {
305        self.features()
306    }
307
308    fn coroutine_hidden_types(
309        self,
310        def_id: DefId,
311    ) -> ty::EarlyBinder<'tcx, ty::Binder<'tcx, ty::CoroutineWitnessTypes<TyCtxt<'tcx>>>> {
312        self.coroutine_hidden_types(def_id)
313    }
314
315    fn fn_sig(self, def_id: DefId) -> ty::EarlyBinder<'tcx, ty::PolyFnSig<'tcx>> {
316        self.fn_sig(def_id)
317    }
318
319    fn coroutine_movability(self, def_id: DefId) -> rustc_ast::Movability {
320        self.coroutine_movability(def_id)
321    }
322
323    fn coroutine_for_closure(self, def_id: DefId) -> DefId {
324        self.coroutine_for_closure(def_id)
325    }
326
327    fn generics_require_sized_self(self, def_id: DefId) -> bool {
328        self.generics_require_sized_self(def_id)
329    }
330
331    fn item_bounds(
332        self,
333        def_id: DefId,
334    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Clause<'tcx>>> {
335        self.item_bounds(def_id).map_bound(IntoIterator::into_iter)
336    }
337
338    fn item_self_bounds(
339        self,
340        def_id: DefId,
341    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Clause<'tcx>>> {
342        self.item_self_bounds(def_id).map_bound(IntoIterator::into_iter)
343    }
344
345    fn item_non_self_bounds(
346        self,
347        def_id: DefId,
348    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Clause<'tcx>>> {
349        self.item_non_self_bounds(def_id).map_bound(IntoIterator::into_iter)
350    }
351
352    fn predicates_of(
353        self,
354        def_id: DefId,
355    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Clause<'tcx>>> {
356        ty::EarlyBinder::bind(
357            self.predicates_of(def_id).instantiate_identity(self).predicates.into_iter(),
358        )
359    }
360
361    fn own_predicates_of(
362        self,
363        def_id: DefId,
364    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Clause<'tcx>>> {
365        ty::EarlyBinder::bind(
366            self.predicates_of(def_id).instantiate_own_identity().map(|(clause, _)| clause),
367        )
368    }
369
370    fn explicit_super_predicates_of(
371        self,
372        def_id: DefId,
373    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = (ty::Clause<'tcx>, Span)>> {
374        self.explicit_super_predicates_of(def_id).map_bound(|preds| preds.into_iter().copied())
375    }
376
377    fn explicit_implied_predicates_of(
378        self,
379        def_id: DefId,
380    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = (ty::Clause<'tcx>, Span)>> {
381        self.explicit_implied_predicates_of(def_id).map_bound(|preds| preds.into_iter().copied())
382    }
383
384    fn impl_super_outlives(
385        self,
386        impl_def_id: DefId,
387    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Clause<'tcx>>> {
388        self.impl_super_outlives(impl_def_id)
389    }
390
391    fn impl_is_const(self, def_id: DefId) -> bool {
392        if true {
    match self.def_kind(def_id) {
        DefKind::Impl { of_trait: true } => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "DefKind::Impl { of_trait: true }",
                ::core::option::Option::None);
        }
    };
};debug_assert_matches!(self.def_kind(def_id), DefKind::Impl { of_trait: true });
393        self.is_conditionally_const(def_id)
394    }
395
396    fn fn_is_const(self, def_id: DefId) -> bool {
397        if true {
    match self.def_kind(def_id) {
        DefKind::Fn | DefKind::AssocFn |
            DefKind::Ctor(CtorOf::Struct, CtorKind::Fn) => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(CtorOf::Struct, CtorKind::Fn)",
                ::core::option::Option::None);
        }
    };
};debug_assert_matches!(
398            self.def_kind(def_id),
399            DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(CtorOf::Struct, CtorKind::Fn)
400        );
401        self.is_conditionally_const(def_id)
402    }
403
404    fn closure_is_const(self, def_id: DefId) -> bool {
405        if true {
    match self.def_kind(def_id) {
        DefKind::Closure => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "DefKind::Closure", ::core::option::Option::None);
        }
    };
};debug_assert_matches!(self.def_kind(def_id), DefKind::Closure);
406        self.constness(def_id) == hir::Constness::Const
407    }
408
409    fn alias_has_const_conditions(self, def_id: DefId) -> bool {
410        if true {
    match self.def_kind(def_id) {
        DefKind::AssocTy | DefKind::OpaqueTy => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "DefKind::AssocTy | DefKind::OpaqueTy",
                ::core::option::Option::None);
        }
    };
};debug_assert_matches!(self.def_kind(def_id), DefKind::AssocTy | DefKind::OpaqueTy);
411        self.is_conditionally_const(def_id)
412    }
413
414    fn const_conditions(
415        self,
416        def_id: DefId,
417    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Binder<'tcx, ty::TraitRef<'tcx>>>> {
418        ty::EarlyBinder::bind(
419            self.const_conditions(def_id).instantiate_identity(self).into_iter().map(|(c, _)| c),
420        )
421    }
422
423    fn explicit_implied_const_bounds(
424        self,
425        def_id: DefId,
426    ) -> ty::EarlyBinder<'tcx, impl IntoIterator<Item = ty::Binder<'tcx, ty::TraitRef<'tcx>>>> {
427        ty::EarlyBinder::bind(
428            self.explicit_implied_const_bounds(def_id).iter_identity_copied().map(|(c, _)| c),
429        )
430    }
431
432    fn impl_self_is_guaranteed_unsized(self, impl_def_id: DefId) -> bool {
433        self.impl_self_is_guaranteed_unsized(impl_def_id)
434    }
435
436    fn has_target_features(self, def_id: DefId) -> bool {
437        !self.codegen_fn_attrs(def_id).target_features.is_empty()
438    }
439
440    fn require_lang_item(self, lang_item: SolverLangItem) -> DefId {
441        self.require_lang_item(solver_lang_item_to_lang_item(lang_item), DUMMY_SP)
442    }
443
444    fn require_trait_lang_item(self, lang_item: SolverTraitLangItem) -> DefId {
445        self.require_lang_item(solver_trait_lang_item_to_lang_item(lang_item), DUMMY_SP)
446    }
447
448    fn require_adt_lang_item(self, lang_item: SolverAdtLangItem) -> DefId {
449        self.require_lang_item(solver_adt_lang_item_to_lang_item(lang_item), DUMMY_SP)
450    }
451
452    fn is_lang_item(self, def_id: DefId, lang_item: SolverLangItem) -> bool {
453        self.is_lang_item(def_id, solver_lang_item_to_lang_item(lang_item))
454    }
455
456    fn is_trait_lang_item(self, def_id: DefId, lang_item: SolverTraitLangItem) -> bool {
457        self.is_lang_item(def_id, solver_trait_lang_item_to_lang_item(lang_item))
458    }
459
460    fn is_adt_lang_item(self, def_id: DefId, lang_item: SolverAdtLangItem) -> bool {
461        self.is_lang_item(def_id, solver_adt_lang_item_to_lang_item(lang_item))
462    }
463
464    fn is_default_trait(self, def_id: DefId) -> bool {
465        self.is_default_trait(def_id)
466    }
467
468    fn is_sizedness_trait(self, def_id: DefId) -> bool {
469        self.is_sizedness_trait(def_id)
470    }
471
472    fn as_lang_item(self, def_id: DefId) -> Option<SolverLangItem> {
473        lang_item_to_solver_lang_item(self.lang_items().from_def_id(def_id)?)
474    }
475
476    fn as_trait_lang_item(self, def_id: DefId) -> Option<SolverTraitLangItem> {
477        lang_item_to_solver_trait_lang_item(self.lang_items().from_def_id(def_id)?)
478    }
479
480    fn as_adt_lang_item(self, def_id: DefId) -> Option<SolverAdtLangItem> {
481        lang_item_to_solver_adt_lang_item(self.lang_items().from_def_id(def_id)?)
482    }
483
484    fn associated_type_def_ids(self, def_id: DefId) -> impl IntoIterator<Item = DefId> {
485        self.associated_items(def_id)
486            .in_definition_order()
487            .filter(|assoc_item| assoc_item.is_type())
488            .map(|assoc_item| assoc_item.def_id)
489    }
490
491    // This implementation is a bit different from `TyCtxt::for_each_relevant_impl`,
492    // since we want to skip over blanket impls for non-rigid aliases, and also we
493    // only want to consider types that *actually* unify with float/int vars.
494    fn for_each_relevant_impl(
495        self,
496        trait_def_id: DefId,
497        self_ty: Ty<'tcx>,
498        mut f: impl FnMut(DefId),
499    ) {
500        let tcx = self;
501        let trait_impls = tcx.trait_impls_of(trait_def_id);
502        let mut consider_impls_for_simplified_type = |simp| {
503            if let Some(impls_for_type) = trait_impls.non_blanket_impls().get(&simp) {
504                for &impl_def_id in impls_for_type {
505                    f(impl_def_id);
506                }
507            }
508        };
509
510        match self_ty.kind() {
511            ty::Bool
512            | ty::Char
513            | ty::Int(_)
514            | ty::Uint(_)
515            | ty::Float(_)
516            | ty::Adt(_, _)
517            | ty::Foreign(_)
518            | ty::Str
519            | ty::Array(_, _)
520            | ty::Pat(_, _)
521            | ty::Slice(_)
522            | ty::RawPtr(_, _)
523            | ty::Ref(_, _, _)
524            | ty::FnDef(_, _)
525            | ty::FnPtr(..)
526            | ty::Dynamic(_, _)
527            | ty::Closure(..)
528            | ty::CoroutineClosure(..)
529            | ty::Coroutine(_, _)
530            | ty::Never
531            | ty::Tuple(_)
532            | ty::UnsafeBinder(_) => {
533                if let Some(simp) = ty::fast_reject::simplify_type(
534                    tcx,
535                    self_ty,
536                    ty::fast_reject::TreatParams::AsRigid,
537                ) {
538                    consider_impls_for_simplified_type(simp);
539                }
540            }
541
542            // HACK: For integer and float variables we have to manually look at all impls
543            // which have some integer or float as a self type.
544            ty::Infer(ty::IntVar(_)) => {
545                use ty::IntTy::*;
546                use ty::UintTy::*;
547                // This causes a compiler error if any new integer kinds are added.
548                let (I8 | I16 | I32 | I64 | I128 | Isize): ty::IntTy;
549                let (U8 | U16 | U32 | U64 | U128 | Usize): ty::UintTy;
550                let possible_integers = [
551                    // signed integers
552                    ty::SimplifiedType::Int(I8),
553                    ty::SimplifiedType::Int(I16),
554                    ty::SimplifiedType::Int(I32),
555                    ty::SimplifiedType::Int(I64),
556                    ty::SimplifiedType::Int(I128),
557                    ty::SimplifiedType::Int(Isize),
558                    // unsigned integers
559                    ty::SimplifiedType::Uint(U8),
560                    ty::SimplifiedType::Uint(U16),
561                    ty::SimplifiedType::Uint(U32),
562                    ty::SimplifiedType::Uint(U64),
563                    ty::SimplifiedType::Uint(U128),
564                    ty::SimplifiedType::Uint(Usize),
565                ];
566                for simp in possible_integers {
567                    consider_impls_for_simplified_type(simp);
568                }
569            }
570
571            ty::Infer(ty::FloatVar(_)) => {
572                // This causes a compiler error if any new float kinds are added.
573                let (ty::FloatTy::F16 | ty::FloatTy::F32 | ty::FloatTy::F64 | ty::FloatTy::F128);
574                let possible_floats = [
575                    ty::SimplifiedType::Float(ty::FloatTy::F16),
576                    ty::SimplifiedType::Float(ty::FloatTy::F32),
577                    ty::SimplifiedType::Float(ty::FloatTy::F64),
578                    ty::SimplifiedType::Float(ty::FloatTy::F128),
579                ];
580
581                for simp in possible_floats {
582                    consider_impls_for_simplified_type(simp);
583                }
584            }
585
586            // The only traits applying to aliases and placeholders are blanket impls.
587            //
588            // Impls which apply to an alias after normalization are handled by
589            // `assemble_candidates_after_normalizing_self_ty`.
590            ty::Alias(_, _) | ty::Placeholder(..) | ty::Error(_) => (),
591
592            // FIXME: These should ideally not exist as a self type. It would be nice for
593            // the builtin auto trait impls of coroutines to instead directly recurse
594            // into the witness.
595            ty::CoroutineWitness(..) => (),
596
597            // These variants should not exist as a self type.
598            ty::Infer(ty::TyVar(_) | ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_))
599            | ty::Param(_)
600            | ty::Bound(_, _) => crate::util::bug::bug_fmt(format_args!("unexpected self type: {0}", self_ty))bug!("unexpected self type: {self_ty}"),
601        }
602
603        #[allow(rustc::usage_of_type_ir_traits)]
604        self.for_each_blanket_impl(trait_def_id, f)
605    }
606    fn for_each_blanket_impl(self, trait_def_id: DefId, mut f: impl FnMut(DefId)) {
607        let trait_impls = self.trait_impls_of(trait_def_id);
608        for &impl_def_id in trait_impls.blanket_impls() {
609            f(impl_def_id);
610        }
611    }
612
613    fn has_item_definition(self, def_id: DefId) -> bool {
614        self.defaultness(def_id).has_value()
615    }
616
617    fn impl_specializes(self, impl_def_id: Self::DefId, victim_def_id: Self::DefId) -> bool {
618        self.specializes((impl_def_id, victim_def_id))
619    }
620
621    fn impl_is_default(self, impl_def_id: DefId) -> bool {
622        self.defaultness(impl_def_id).is_default()
623    }
624
625    fn impl_trait_ref(self, impl_def_id: DefId) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
626        self.impl_trait_ref(impl_def_id)
627    }
628
629    fn impl_polarity(self, impl_def_id: DefId) -> ty::ImplPolarity {
630        self.impl_polarity(impl_def_id)
631    }
632
633    fn trait_is_auto(self, trait_def_id: DefId) -> bool {
634        self.trait_is_auto(trait_def_id)
635    }
636
637    fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
638        self.trait_is_coinductive(trait_def_id)
639    }
640
641    fn trait_is_alias(self, trait_def_id: DefId) -> bool {
642        self.trait_is_alias(trait_def_id)
643    }
644
645    fn trait_is_dyn_compatible(self, trait_def_id: DefId) -> bool {
646        self.is_dyn_compatible(trait_def_id)
647    }
648
649    fn trait_is_fundamental(self, def_id: DefId) -> bool {
650        self.trait_def(def_id).is_fundamental
651    }
652
653    fn trait_is_unsafe(self, trait_def_id: Self::DefId) -> bool {
654        self.trait_def(trait_def_id).safety.is_unsafe()
655    }
656
657    fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
658        self.is_impl_trait_in_trait(def_id)
659    }
660
661    fn delay_bug(self, msg: impl ToString) -> ErrorGuaranteed {
662        self.dcx().span_delayed_bug(DUMMY_SP, msg.to_string())
663    }
664
665    fn is_general_coroutine(self, coroutine_def_id: DefId) -> bool {
666        self.is_general_coroutine(coroutine_def_id)
667    }
668
669    fn coroutine_is_async(self, coroutine_def_id: DefId) -> bool {
670        self.coroutine_is_async(coroutine_def_id)
671    }
672
673    fn coroutine_is_gen(self, coroutine_def_id: DefId) -> bool {
674        self.coroutine_is_gen(coroutine_def_id)
675    }
676
677    fn coroutine_is_async_gen(self, coroutine_def_id: DefId) -> bool {
678        self.coroutine_is_async_gen(coroutine_def_id)
679    }
680
681    type UnsizingParams = &'tcx rustc_index::bit_set::DenseBitSet<u32>;
682    fn unsizing_params_for_adt(self, adt_def_id: DefId) -> Self::UnsizingParams {
683        self.unsizing_params_for_adt(adt_def_id)
684    }
685
686    fn anonymize_bound_vars<T: TypeFoldable<TyCtxt<'tcx>>>(
687        self,
688        binder: ty::Binder<'tcx, T>,
689    ) -> ty::Binder<'tcx, T> {
690        self.anonymize_bound_vars(binder)
691    }
692
693    fn opaque_types_defined_by(self, defining_anchor: LocalDefId) -> Self::LocalDefIds {
694        self.opaque_types_defined_by(defining_anchor)
695    }
696
697    fn opaque_types_and_coroutines_defined_by(
698        self,
699        defining_anchor: Self::LocalDefId,
700    ) -> Self::LocalDefIds {
701        let coroutines_defined_by = self
702            .nested_bodies_within(defining_anchor)
703            .iter()
704            .filter(|def_id| self.is_coroutine(def_id.to_def_id()));
705        self.mk_local_def_ids_from_iter(
706            self.opaque_types_defined_by(defining_anchor).iter().chain(coroutines_defined_by),
707        )
708    }
709
710    type Probe = &'tcx inspect::Probe<TyCtxt<'tcx>>;
711    fn mk_probe(self, probe: inspect::Probe<Self>) -> &'tcx inspect::Probe<TyCtxt<'tcx>> {
712        self.arena.alloc(probe)
713    }
714    fn evaluate_root_goal_for_proof_tree_raw(
715        self,
716        canonical_goal: CanonicalInput<'tcx>,
717    ) -> (QueryResult<'tcx>, &'tcx inspect::Probe<TyCtxt<'tcx>>) {
718        self.evaluate_root_goal_for_proof_tree_raw(canonical_goal)
719    }
720
721    fn item_name(self, id: DefId) -> Symbol {
722        self.opt_item_name(id).unwrap_or_else(|| {
723            crate::util::bug::bug_fmt(format_args!("item_name: no name for {0:?}",
        self.def_path(id)));bug!("item_name: no name for {:?}", self.def_path(id));
724        })
725    }
726}
727
728/// Defines trivial conversion functions between the main [`LangItem`] enum,
729/// and some other lang-item enum that is a subset of it.
730macro_rules! bidirectional_lang_item_map {
731    (
732        $solver_ty:ident, fn $to_solver:ident, fn $from_solver:ident;
733        $($name:ident),+ $(,)?
734    ) => {
735        fn $from_solver(lang_item: $solver_ty) -> LangItem {
736            match lang_item {
737                $($solver_ty::$name => LangItem::$name,)+
738            }
739        }
740
741        fn $to_solver(lang_item: LangItem) -> Option<$solver_ty> {
742            Some(match lang_item {
743                $(LangItem::$name => $solver_ty::$name,)+
744                _ => return None,
745            })
746        }
747    }
748}
749
750fn solver_lang_item_to_lang_item(lang_item: SolverLangItem) -> LangItem {
    match lang_item {
        SolverLangItem::AsyncFnKindUpvars => LangItem::AsyncFnKindUpvars,
        SolverLangItem::AsyncFnOnceOutput => LangItem::AsyncFnOnceOutput,
        SolverLangItem::CallOnceFuture => LangItem::CallOnceFuture,
        SolverLangItem::CallRefFuture => LangItem::CallRefFuture,
        SolverLangItem::CoroutineReturn => LangItem::CoroutineReturn,
        SolverLangItem::CoroutineYield => LangItem::CoroutineYield,
        SolverLangItem::DynMetadata => LangItem::DynMetadata,
        SolverLangItem::FieldBase => LangItem::FieldBase,
        SolverLangItem::FieldType => LangItem::FieldType,
        SolverLangItem::FutureOutput => LangItem::FutureOutput,
        SolverLangItem::Metadata => LangItem::Metadata,
    }
}
fn lang_item_to_solver_lang_item(lang_item: LangItem)
    -> Option<SolverLangItem> {
    Some(match lang_item {
            LangItem::AsyncFnKindUpvars => SolverLangItem::AsyncFnKindUpvars,
            LangItem::AsyncFnOnceOutput => SolverLangItem::AsyncFnOnceOutput,
            LangItem::CallOnceFuture => SolverLangItem::CallOnceFuture,
            LangItem::CallRefFuture => SolverLangItem::CallRefFuture,
            LangItem::CoroutineReturn => SolverLangItem::CoroutineReturn,
            LangItem::CoroutineYield => SolverLangItem::CoroutineYield,
            LangItem::DynMetadata => SolverLangItem::DynMetadata,
            LangItem::FieldBase => SolverLangItem::FieldBase,
            LangItem::FieldType => SolverLangItem::FieldType,
            LangItem::FutureOutput => SolverLangItem::FutureOutput,
            LangItem::Metadata => SolverLangItem::Metadata,
            _ => return None,
        })
}bidirectional_lang_item_map! {
751    SolverLangItem, fn lang_item_to_solver_lang_item, fn solver_lang_item_to_lang_item;
752
753// tidy-alphabetical-start
754    AsyncFnKindUpvars,
755    AsyncFnOnceOutput,
756    CallOnceFuture,
757    CallRefFuture,
758    CoroutineReturn,
759    CoroutineYield,
760    DynMetadata,
761    FieldBase,
762    FieldType,
763    FutureOutput,
764    Metadata,
765// tidy-alphabetical-end
766}
767
768fn solver_adt_lang_item_to_lang_item(lang_item: SolverAdtLangItem)
    -> LangItem {
    match lang_item {
        SolverAdtLangItem::Option => LangItem::Option,
        SolverAdtLangItem::Poll => LangItem::Poll,
    }
}
fn lang_item_to_solver_adt_lang_item(lang_item: LangItem)
    -> Option<SolverAdtLangItem> {
    Some(match lang_item {
            LangItem::Option => SolverAdtLangItem::Option,
            LangItem::Poll => SolverAdtLangItem::Poll,
            _ => return None,
        })
}bidirectional_lang_item_map! {
769    SolverAdtLangItem, fn lang_item_to_solver_adt_lang_item, fn solver_adt_lang_item_to_lang_item;
770
771// tidy-alphabetical-start
772    Option,
773    Poll,
774// tidy-alphabetical-end
775}
776
777fn solver_trait_lang_item_to_lang_item(lang_item: SolverTraitLangItem)
    -> LangItem {
    match lang_item {
        SolverTraitLangItem::AsyncFn => LangItem::AsyncFn,
        SolverTraitLangItem::AsyncFnKindHelper => LangItem::AsyncFnKindHelper,
        SolverTraitLangItem::AsyncFnMut => LangItem::AsyncFnMut,
        SolverTraitLangItem::AsyncFnOnce => LangItem::AsyncFnOnce,
        SolverTraitLangItem::AsyncFnOnceOutput => LangItem::AsyncFnOnceOutput,
        SolverTraitLangItem::AsyncIterator => LangItem::AsyncIterator,
        SolverTraitLangItem::BikeshedGuaranteedNoDrop =>
            LangItem::BikeshedGuaranteedNoDrop,
        SolverTraitLangItem::Clone => LangItem::Clone,
        SolverTraitLangItem::Copy => LangItem::Copy,
        SolverTraitLangItem::Coroutine => LangItem::Coroutine,
        SolverTraitLangItem::Destruct => LangItem::Destruct,
        SolverTraitLangItem::DiscriminantKind => LangItem::DiscriminantKind,
        SolverTraitLangItem::Drop => LangItem::Drop,
        SolverTraitLangItem::Field => LangItem::Field,
        SolverTraitLangItem::Fn => LangItem::Fn,
        SolverTraitLangItem::FnMut => LangItem::FnMut,
        SolverTraitLangItem::FnOnce => LangItem::FnOnce,
        SolverTraitLangItem::FnPtrTrait => LangItem::FnPtrTrait,
        SolverTraitLangItem::FusedIterator => LangItem::FusedIterator,
        SolverTraitLangItem::Future => LangItem::Future,
        SolverTraitLangItem::Iterator => LangItem::Iterator,
        SolverTraitLangItem::MetaSized => LangItem::MetaSized,
        SolverTraitLangItem::PointeeSized => LangItem::PointeeSized,
        SolverTraitLangItem::PointeeTrait => LangItem::PointeeTrait,
        SolverTraitLangItem::Sized => LangItem::Sized,
        SolverTraitLangItem::TransmuteTrait => LangItem::TransmuteTrait,
        SolverTraitLangItem::TrivialClone => LangItem::TrivialClone,
        SolverTraitLangItem::Tuple => LangItem::Tuple,
        SolverTraitLangItem::Unpin => LangItem::Unpin,
        SolverTraitLangItem::Unsize => LangItem::Unsize,
    }
}
fn lang_item_to_solver_trait_lang_item(lang_item: LangItem)
    -> Option<SolverTraitLangItem> {
    Some(match lang_item {
            LangItem::AsyncFn => SolverTraitLangItem::AsyncFn,
            LangItem::AsyncFnKindHelper =>
                SolverTraitLangItem::AsyncFnKindHelper,
            LangItem::AsyncFnMut => SolverTraitLangItem::AsyncFnMut,
            LangItem::AsyncFnOnce => SolverTraitLangItem::AsyncFnOnce,
            LangItem::AsyncFnOnceOutput =>
                SolverTraitLangItem::AsyncFnOnceOutput,
            LangItem::AsyncIterator => SolverTraitLangItem::AsyncIterator,
            LangItem::BikeshedGuaranteedNoDrop =>
                SolverTraitLangItem::BikeshedGuaranteedNoDrop,
            LangItem::Clone => SolverTraitLangItem::Clone,
            LangItem::Copy => SolverTraitLangItem::Copy,
            LangItem::Coroutine => SolverTraitLangItem::Coroutine,
            LangItem::Destruct => SolverTraitLangItem::Destruct,
            LangItem::DiscriminantKind =>
                SolverTraitLangItem::DiscriminantKind,
            LangItem::Drop => SolverTraitLangItem::Drop,
            LangItem::Field => SolverTraitLangItem::Field,
            LangItem::Fn => SolverTraitLangItem::Fn,
            LangItem::FnMut => SolverTraitLangItem::FnMut,
            LangItem::FnOnce => SolverTraitLangItem::FnOnce,
            LangItem::FnPtrTrait => SolverTraitLangItem::FnPtrTrait,
            LangItem::FusedIterator => SolverTraitLangItem::FusedIterator,
            LangItem::Future => SolverTraitLangItem::Future,
            LangItem::Iterator => SolverTraitLangItem::Iterator,
            LangItem::MetaSized => SolverTraitLangItem::MetaSized,
            LangItem::PointeeSized => SolverTraitLangItem::PointeeSized,
            LangItem::PointeeTrait => SolverTraitLangItem::PointeeTrait,
            LangItem::Sized => SolverTraitLangItem::Sized,
            LangItem::TransmuteTrait => SolverTraitLangItem::TransmuteTrait,
            LangItem::TrivialClone => SolverTraitLangItem::TrivialClone,
            LangItem::Tuple => SolverTraitLangItem::Tuple,
            LangItem::Unpin => SolverTraitLangItem::Unpin,
            LangItem::Unsize => SolverTraitLangItem::Unsize,
            _ => return None,
        })
}bidirectional_lang_item_map! {
778    SolverTraitLangItem, fn lang_item_to_solver_trait_lang_item, fn solver_trait_lang_item_to_lang_item;
779
780// tidy-alphabetical-start
781    AsyncFn,
782    AsyncFnKindHelper,
783    AsyncFnMut,
784    AsyncFnOnce,
785    AsyncFnOnceOutput,
786    AsyncIterator,
787    BikeshedGuaranteedNoDrop,
788    Clone,
789    Copy,
790    Coroutine,
791    Destruct,
792    DiscriminantKind,
793    Drop,
794    Field,
795    Fn,
796    FnMut,
797    FnOnce,
798    FnPtrTrait,
799    FusedIterator,
800    Future,
801    Iterator,
802    MetaSized,
803    PointeeSized,
804    PointeeTrait,
805    Sized,
806    TransmuteTrait,
807    TrivialClone,
808    Tuple,
809    Unpin,
810    Unsize,
811// tidy-alphabetical-end
812}