1use 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 }
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 fn debug_assert_existential_args_compatible(
270 self,
271 def_id: Self::DefId,
272 args: Self::GenericArgs,
273 ) {
274 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 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 ty::Infer(ty::IntVar(_)) => {
545 use ty::IntTy::*;
546 use ty::UintTy::*;
547 let (I8 | I16 | I32 | I64 | I128 | Isize): ty::IntTy;
549 let (U8 | U16 | U32 | U64 | U128 | Usize): ty::UintTy;
550 let possible_integers = [
551 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 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 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 ty::Alias(_, _) | ty::Placeholder(..) | ty::Error(_) => (),
591
592 ty::CoroutineWitness(..) => (),
596
597 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
728macro_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
753AsyncFnKindUpvars,
755 AsyncFnOnceOutput,
756 CallOnceFuture,
757 CallRefFuture,
758 CoroutineReturn,
759 CoroutineYield,
760 DynMetadata,
761 FieldBase,
762 FieldType,
763 FutureOutput,
764 Metadata,
765}
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
771Option,
773 Poll,
774}
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
780AsyncFn,
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}