1use rustc_data_structures::fx::FxHashSet;
2use rustc_hir as hir;
3use rustc_hir::def::DefKind;
4use rustc_index::bit_set::DenseBitSet;
5use rustc_infer::infer::TyCtxtInferExt;
6use rustc_middle::query::Providers;
7use rustc_middle::ty::{
8 self, SizedTraitKind, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor, Unnormalized,
9 Upcast, fold_regions,
10};
11use rustc_span::def_id::{CRATE_DEF_ID, DefId, LocalDefId};
12use rustc_span::{DUMMY_SP, bug};
13use rustc_trait_selection::traits;
14use tracing::instrument;
15
16{}
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() || { false }
{
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("sizedness_constraint_for_ty",
"rustc_ty_utils::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_ty_utils/src/ty.rs"),
::tracing_core::__macro_support::Option::Some(18u32),
::tracing_core::__macro_support::Option::Some("rustc_ty_utils::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("sizedness")
}> =
::tracing::__macro_support::FieldName::new("sizedness");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("ty")
}> =
::tracing::__macro_support::FieldName::new("ty");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&sizedness)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ty)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[allow(clippy :: redundant_closure_call)]
let x =
(move ||
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy
:: needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: Option<Ty<'tcx>> = loop {};
return __tracing_attr_fake_return;
}
{
match ty.kind() {
ty::Bool | ty::Char | ty::Int(..) | ty::Uint(..) |
ty::Float(..) | ty::RawPtr(..) | ty::Ref(..) | ty::FnDef(..)
| ty::FnPtr(..) | ty::Array(..) | ty::Closure(..) |
ty::CoroutineClosure(..) | ty::Coroutine(..) |
ty::CoroutineWitness(..) | ty::Never => None,
ty::Str | ty::Slice(..) | ty::Dynamic(_, _) =>
match sizedness {
SizedTraitKind::Sized => Some(ty),
SizedTraitKind::MetaSized => None,
},
ty::Param(..) | ty::Alias(..) | ty::Error(_) => Some(ty),
ty::UnsafeBinder(inner_ty) => {
sizedness_constraint_for_ty(tcx, sizedness,
inner_ty.skip_binder()).map(|_| ty)
}
ty::Foreign(..) => Some(ty),
ty::Pat(ty, _) =>
sizedness_constraint_for_ty(tcx, sizedness, *ty),
ty::Tuple(tys) => {
tys.last().and_then(|&ty|
sizedness_constraint_for_ty(tcx, sizedness, ty))
}
ty::Adt(adt, args) =>
adt.sizedness_constraint(tcx,
sizedness).and_then(|intermediate|
{
let ty =
intermediate.instantiate(tcx, args).skip_norm_wip();
sizedness_constraint_for_ty(tcx, sizedness, ty)
}),
ty::Placeholder(..) | ty::Bound(..) | ty::Infer(..) => {
bug_impl(None,
format_args!("unexpected type `{0:?}` in `sizedness_constraint_for_ty`",
ty), Location::caller())
}
}
}
})();
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_ty_utils/src/ty.rs:18",
"rustc_ty_utils::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_ty_utils/src/ty.rs"),
::tracing_core::__macro_support::Option::Some(18u32),
::tracing_core::__macro_support::Option::Some("rustc_ty_utils::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("return")
}> =
::tracing::__macro_support::FieldName::new("return");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&x)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};
x;#[instrument(level = "debug", skip(tcx), ret)]
19fn sizedness_constraint_for_ty<'tcx>(
20 tcx: TyCtxt<'tcx>,
21 sizedness: SizedTraitKind,
22 ty: Ty<'tcx>,
23) -> Option<Ty<'tcx>> {
24 match ty.kind() {
25 ty::Bool
27 | ty::Char
28 | ty::Int(..)
29 | ty::Uint(..)
30 | ty::Float(..)
31 | ty::RawPtr(..)
32 | ty::Ref(..)
33 | ty::FnDef(..)
34 | ty::FnPtr(..)
35 | ty::Array(..)
36 | ty::Closure(..)
37 | ty::CoroutineClosure(..)
38 | ty::Coroutine(..)
39 | ty::CoroutineWitness(..)
40 | ty::Never => None,
41
42 ty::Str | ty::Slice(..) | ty::Dynamic(_, _) => match sizedness {
43 SizedTraitKind::Sized => Some(ty),
45 SizedTraitKind::MetaSized => None,
47 },
48
49 ty::Param(..) | ty::Alias(..) | ty::Error(_) => Some(ty),
51
52 ty::UnsafeBinder(inner_ty) => {
56 sizedness_constraint_for_ty(tcx, sizedness, inner_ty.skip_binder()).map(|_| ty)
57 }
58
59 ty::Foreign(..) => Some(ty),
61
62 ty::Pat(ty, _) => sizedness_constraint_for_ty(tcx, sizedness, *ty),
64
65 ty::Tuple(tys) => {
66 tys.last().and_then(|&ty| sizedness_constraint_for_ty(tcx, sizedness, ty))
67 }
68
69 ty::Adt(adt, args) => adt.sizedness_constraint(tcx, sizedness).and_then(|intermediate| {
70 let ty = intermediate.instantiate(tcx, args).skip_norm_wip();
71 sizedness_constraint_for_ty(tcx, sizedness, ty)
72 }),
73
74 ty::Placeholder(..) | ty::Bound(..) | ty::Infer(..) => {
75 bug!("unexpected type `{ty:?}` in `sizedness_constraint_for_ty`")
76 }
77 }
78}
79
80fn defaultness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Defaultness {
81 match tcx.hir_node_by_def_id(def_id) {
82 hir::Node::Item(hir::Item {
83 kind:
84 hir::ItemKind::Impl(hir::Impl {
85 of_trait: Some(hir::TraitImplHeader { defaultness, .. }),
86 ..
87 }),
88 ..
89 })
90 | hir::Node::ImplItem(hir::ImplItem {
91 impl_kind: hir::ImplItemImplKind::Trait { defaultness, .. },
92 ..
93 })
94 | hir::Node::TraitItem(hir::TraitItem { defaultness, .. }) => *defaultness,
95 node => {
96 bug_impl(None, format_args!("`defaultness` called on {0:?}", node),
Location::caller());bug!("`defaultness` called on {:?}", node);
97 }
98 }
99}
100
101{}
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() || { false }
{
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("adt_sizedness_constraint",
"rustc_ty_utils::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_ty_utils/src/ty.rs"),
::tracing_core::__macro_support::Option::Some(113u32),
::tracing_core::__macro_support::Option::Some("rustc_ty_utils::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("def_id")
}> =
::tracing::__macro_support::FieldName::new("def_id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("sizedness")
}> =
::tracing::__macro_support::FieldName::new("sizedness");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&def_id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&sizedness)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[allow(clippy :: redundant_closure_call)]
let x =
(move ||
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy
:: needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return:
Option<ty::EarlyBinder<'tcx, Ty<'tcx>>> = loop {};
return __tracing_attr_fake_return;
}
{
if let Some(def_id) = def_id.as_local() {
tcx.ensure_ok().check_representability(def_id);
}
let def = tcx.adt_def(def_id);
if !def.is_struct() {
bug_impl(None,
format_args!("`adt_sizedness_constraint` called on non-struct type: {0:?}",
def), Location::caller());
}
let tail_def = def.non_enum_variant().tail_opt()?;
let tail_ty =
tcx.type_of(tail_def.did).instantiate_identity().skip_norm_wip();
let constraint_ty =
sizedness_constraint_for_ty(tcx, sizedness, tail_ty)?;
let sizedness_trait_def_id =
sizedness.require_lang_item(tcx);
let clauses = tcx.clauses_of(def.did()).clauses;
if clauses.iter().any(|(c, _)|
{
c.as_trait_clause().is_some_and(|trait_pred|
{
trait_pred.def_id() == sizedness_trait_def_id &&
trait_pred.self_ty().skip_binder() == constraint_ty
})
}) {
return None;
}
Some(ty::EarlyBinder::bind(tcx, constraint_ty))
}
})();
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_ty_utils/src/ty.rs:113",
"rustc_ty_utils::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_ty_utils/src/ty.rs"),
::tracing_core::__macro_support::Option::Some(113u32),
::tracing_core::__macro_support::Option::Some("rustc_ty_utils::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("return")
}> =
::tracing::__macro_support::FieldName::new("return");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&x)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};
x;#[instrument(level = "debug", skip(tcx), ret)]
114fn adt_sizedness_constraint<'tcx>(
115 tcx: TyCtxt<'tcx>,
116 (def_id, sizedness): (DefId, SizedTraitKind),
117) -> Option<ty::EarlyBinder<'tcx, Ty<'tcx>>> {
118 if let Some(def_id) = def_id.as_local() {
119 tcx.ensure_ok().check_representability(def_id);
120 }
121
122 let def = tcx.adt_def(def_id);
123
124 if !def.is_struct() {
125 bug!("`adt_sizedness_constraint` called on non-struct type: {def:?}");
126 }
127
128 let tail_def = def.non_enum_variant().tail_opt()?;
129 let tail_ty = tcx.type_of(tail_def.did).instantiate_identity().skip_norm_wip();
130
131 let constraint_ty = sizedness_constraint_for_ty(tcx, sizedness, tail_ty)?;
132
133 let sizedness_trait_def_id = sizedness.require_lang_item(tcx);
136 let clauses = tcx.clauses_of(def.did()).clauses;
137 if clauses.iter().any(|(c, _)| {
138 c.as_trait_clause().is_some_and(|trait_pred| {
139 trait_pred.def_id() == sizedness_trait_def_id
140 && trait_pred.self_ty().skip_binder() == constraint_ty
141 })
142 }) {
143 return None;
144 }
145
146 Some(ty::EarlyBinder::bind(tcx, constraint_ty))
147}
148
149fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> {
151 if tcx.is_typeck_child(def_id) {
152 return tcx.param_env(tcx.typeck_root_def_id(def_id));
153 }
154 let ty::InstantiatedClauses { clauses, .. } = tcx.clauses_of(def_id).instantiate_identity(tcx);
156 let mut clauses: Vec<_> = clauses.into_iter().map(Unnormalized::skip_norm_wip).collect();
157
158 if tcx.def_kind(def_id) == DefKind::AssocFn
171 && let assoc_item = tcx.associated_item(def_id)
172 && assoc_item.container == ty::AssocContainer::Trait
173 && assoc_item.defaultness(tcx).has_value()
174 {
175 let sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
176 sig.skip_binder().visit_with(&mut ImplTraitInTraitFinder {
178 tcx,
179 fn_def_id: def_id,
180 bound_vars: sig.bound_vars(),
181 clauses: &mut clauses,
182 seen: FxHashSet::default(),
183 depth: ty::INNERMOST,
184 });
185 }
186
187 if tcx.is_conditionally_const(def_id) {
190 clauses.extend(tcx.const_conditions(def_id).instantiate_identity(tcx).into_iter().map(
191 |(trait_ref, _)| {
192 trait_ref.to_host_effect_clause(tcx, ty::BoundConstness::Maybe).skip_norm_wip()
193 },
194 ));
195 }
196
197 let local_did = def_id.as_local().unwrap_or(CRATE_DEF_ID);
198
199 let unnormalized_env = ty::ParamEnv::new(tcx, clauses);
200
201 let cause = traits::ObligationCause::misc(tcx.def_span(def_id), local_did);
202 traits::normalize_param_env_or_error(tcx, unnormalized_env, cause)
203}
204
205struct ImplTraitInTraitFinder<'a, 'tcx> {
210 tcx: TyCtxt<'tcx>,
211 clauses: &'a mut Vec<ty::Clause<'tcx>>,
212 fn_def_id: DefId,
213 bound_vars: &'tcx ty::List<ty::BoundVariableKind<'tcx>>,
214 seen: FxHashSet<DefId>,
215 depth: ty::DebruijnIndex,
216}
217
218impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ImplTraitInTraitFinder<'_, 'tcx> {
219 fn visit_binder<T: TypeVisitable<TyCtxt<'tcx>>>(&mut self, binder: &ty::Binder<'tcx, T>) {
220 self.depth.shift_in(1);
221 binder.super_visit_with(self);
222 self.depth.shift_out(1);
223 }
224
225 fn visit_ty(&mut self, ty: Ty<'tcx>) {
226 if let ty::Alias(_, unshifted_alias_ty) = *ty.kind()
227 && let Some(unshifted_alias_ty) = unshifted_alias_ty.try_to_projection()
228 && let Some(
229 ty::ImplTraitInTraitData::Trait { fn_def_id, .. }
230 | ty::ImplTraitInTraitData::Impl { fn_def_id, .. },
231 ) = self.tcx.opt_rpitit_info(unshifted_alias_ty.kind)
232 && fn_def_id == self.fn_def_id
233 && self.seen.insert(unshifted_alias_ty.kind)
234 {
235 let shifted_alias_ty = fold_regions(self.tcx, unshifted_alias_ty, |re, depth| {
239 if let ty::ReBound(ty::BoundVarIndexKind::Bound(index), bv) = re.kind() {
240 if depth != ty::INNERMOST {
241 return ty::Region::new_error_with_message(
242 self.tcx,
243 DUMMY_SP,
244 "we shouldn't walk non-predicate binders with `impl Trait`...",
245 );
246 }
247 ty::Region::new_bound(self.tcx, index.shifted_out_to_binder(self.depth), bv)
248 } else {
249 re
250 }
251 });
252
253 let default_ty = self
257 .tcx
258 .type_of(shifted_alias_ty.kind)
259 .instantiate(self.tcx, shifted_alias_ty.args)
260 .skip_norm_wip();
261
262 self.clauses.push(
263 ty::Binder::bind_with_vars(
264 ty::ProjectionClause {
265 projection_term: shifted_alias_ty.projection_to_alias_ty().into(),
266 term: default_ty.into(),
267 },
268 self.bound_vars,
269 )
270 .upcast(self.tcx),
271 );
272
273 for bound in self
278 .tcx
279 .item_bounds(unshifted_alias_ty.kind)
280 .iter_instantiated(self.tcx, unshifted_alias_ty.args)
281 .map(Unnormalized::skip_norm_wip)
282 {
283 bound.visit_with(self);
284 }
285 }
286
287 ty.super_visit_with(self)
288 }
289}
290
291fn param_env_normalized_for_post_analysis(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> {
292 tcx.param_env(def_id).with_normalized(tcx)
293}
294
295fn asyncness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Asyncness {
297 let node = tcx.hir_node_by_def_id(def_id);
298 node.fn_sig().map_or(ty::Asyncness::No, |sig| match sig.header.asyncness {
299 hir::IsAsync::Async(_) => ty::Asyncness::Yes,
300 hir::IsAsync::NotAsync => ty::Asyncness::No,
301 })
302}
303
304fn unsizing_params_for_adt<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> DenseBitSet<u32> {
305 let def = tcx.adt_def(def_id);
306 let num_params = tcx.generics_of(def_id).count();
307
308 let maybe_unsizing_param_idx = |arg: ty::GenericArg<'tcx>| match arg.kind() {
309 ty::GenericArgKind::Type(ty) => match ty.kind() {
310 ty::Param(p) => Some(p.index),
311 _ => None,
312 },
313
314 ty::GenericArgKind::Lifetime(_) => None,
316
317 ty::GenericArgKind::Const(ct) => match ct.kind() {
318 ty::ConstKind::Param(p) => Some(p.index),
319 _ => None,
320 },
321 };
322
323 let Some((tail_field, prefix_fields)) = def.non_enum_variant().fields.raw.split_last() else {
325 return DenseBitSet::new_empty(num_params);
326 };
327
328 let mut unsizing_params = DenseBitSet::new_empty(num_params);
329 for arg in tcx.type_of(tail_field.did).instantiate_identity().skip_norm_wip().walk() {
330 if let Some(i) = maybe_unsizing_param_idx(arg) {
331 unsizing_params.insert(i);
332 }
333 }
334
335 for field in prefix_fields {
338 for arg in tcx.type_of(field.did).instantiate_identity().skip_norm_wip().walk() {
339 if let Some(i) = maybe_unsizing_param_idx(arg) {
340 unsizing_params.remove(i);
341 }
342 }
343 }
344
345 unsizing_params
346}
347
348fn impl_self_is_guaranteed_unsized<'tcx>(tcx: TyCtxt<'tcx>, impl_def_id: DefId) -> bool {
349 if true {
{
match (&tcx.def_kind(impl_def_id), &DefKind::Impl { of_trait: true })
{
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(tcx.def_kind(impl_def_id), DefKind::Impl { of_trait: true });
350
351 let infcx = tcx.infer_ctxt().ignoring_regions().build(ty::TypingMode::non_body_analysis());
352
353 let ocx = traits::ObligationCtxt::new(&infcx);
354 let cause = traits::ObligationCause::dummy();
355 let param_env = tcx.param_env(impl_def_id);
356
357 let self_ty = ocx.normalize(&cause, param_env, tcx.type_of(impl_def_id).instantiate_identity());
358 let tail = tcx.struct_tail_raw(
359 self_ty,
360 &cause,
361 |ty| {
362 ocx.normalize(&cause, param_env, ty)
364 },
365 || (),
366 );
367
368 match tail.kind() {
369 ty::Dynamic(_, _) | ty::Slice(_) | ty::Str => true,
370 ty::Bool
371 | ty::Char
372 | ty::Int(_)
373 | ty::Uint(_)
374 | ty::Float(_)
375 | ty::Adt(_, _)
376 | ty::Foreign(_)
377 | ty::Array(_, _)
378 | ty::Pat(_, _)
379 | ty::RawPtr(_, _)
380 | ty::Ref(_, _, _)
381 | ty::FnDef(_, _)
382 | ty::FnPtr(_, _)
383 | ty::UnsafeBinder(_)
384 | ty::Closure(_, _)
385 | ty::CoroutineClosure(_, _)
386 | ty::Coroutine(_, _)
387 | ty::CoroutineWitness(_, _)
388 | ty::Never
389 | ty::Tuple(_)
390 | ty::Alias(_, _)
391 | ty::Param(_)
392 | ty::Bound(_, _)
393 | ty::Placeholder(_)
394 | ty::Infer(_)
395 | ty::Error(_) => false,
396 }
397}
398
399pub(crate) fn provide(providers: &mut Providers) {
400 *providers = Providers {
401 asyncness,
402 adt_sizedness_constraint,
403 param_env,
404 param_env_normalized_for_post_analysis,
405 defaultness,
406 unsizing_params_for_adt,
407 impl_self_is_guaranteed_unsized,
408 ..*providers
409 };
410}