Rollup merge of #135228 - compiler-errors:normalizes-ur-dispatch, r=BoxyUwU
Improve `DispatchFromDyn` and `CoerceUnsized` impl validation * Disallow arbitrary 1-ZST fields in `DispatchFromDyn` -- only `PhantomData`, and 1-ZSTs that mention no params (which is needed to support, e.g., the `Global` alloctor in `Box<T, U = Global>`). * Don't allow coercing between non-ZSTs to ZSTs (since the previous check wasn't actually checking the field tys were the same before checking the layout...) * Normalize the field before checking it's `PhantomData`. Fixes #135215 Fixes #135214 Fixes #135220 r? ```@BoxyUwU``` or reassign
This commit is contained in:
commit
f256f9ef22
8 changed files with 153 additions and 11 deletions
|
@ -259,19 +259,37 @@ fn visit_implementation_of_dispatch_from_dyn(checker: &Checker<'_>) -> Result<()
|
|||
let coerced_fields = fields
|
||||
.iter()
|
||||
.filter(|field| {
|
||||
// Ignore PhantomData fields
|
||||
let unnormalized_ty = tcx.type_of(field.did).instantiate_identity();
|
||||
if tcx
|
||||
.try_normalize_erasing_regions(
|
||||
ty::TypingEnv::non_body_analysis(tcx, def_a.did()),
|
||||
unnormalized_ty,
|
||||
)
|
||||
.unwrap_or(unnormalized_ty)
|
||||
.is_phantom_data()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
let ty_a = field.ty(tcx, args_a);
|
||||
let ty_b = field.ty(tcx, args_b);
|
||||
|
||||
if let Ok(layout) =
|
||||
tcx.layout_of(infcx.typing_env(param_env).as_query_input(ty_a))
|
||||
{
|
||||
if layout.is_1zst() {
|
||||
// FIXME: We could do normalization here, but is it really worth it?
|
||||
if ty_a == ty_b {
|
||||
// Allow 1-ZSTs that don't mention type params.
|
||||
//
|
||||
// Allowing type params here would allow us to possibly transmute
|
||||
// between ZSTs, which may be used to create library unsoundness.
|
||||
if let Ok(layout) =
|
||||
tcx.layout_of(infcx.typing_env(param_env).as_query_input(ty_a))
|
||||
&& layout.is_1zst()
|
||||
&& !ty_a.has_non_region_param()
|
||||
{
|
||||
// ignore 1-ZST fields
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ty_a == ty_b {
|
||||
res = Err(tcx.dcx().emit_err(errors::DispatchFromDynZST {
|
||||
span,
|
||||
name: field.name,
|
||||
|
@ -460,8 +478,16 @@ pub(crate) fn coerce_unsized_info<'tcx>(
|
|||
.filter_map(|(i, f)| {
|
||||
let (a, b) = (f.ty(tcx, args_a), f.ty(tcx, args_b));
|
||||
|
||||
if tcx.type_of(f.did).instantiate_identity().is_phantom_data() {
|
||||
// Ignore PhantomData fields
|
||||
// Ignore PhantomData fields
|
||||
let unnormalized_ty = tcx.type_of(f.did).instantiate_identity();
|
||||
if tcx
|
||||
.try_normalize_erasing_regions(
|
||||
ty::TypingEnv::non_body_analysis(tcx, def_a.did()),
|
||||
unnormalized_ty,
|
||||
)
|
||||
.unwrap_or(unnormalized_ty)
|
||||
.is_phantom_data()
|
||||
{
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue