Rollup merge of #120587 - lukas-code:miri-tail-normalize, r=RalfJung
miri: normalize struct tail in ABI compat check fixes https://github.com/rust-lang/miri/issues/3282 extracted from https://github.com/rust-lang/rust/pull/120354, see https://github.com/rust-lang/rust/pull/120354#discussion_r1469154220 for context r? ```@RalfJung```
This commit is contained in:
commit
e348f0739d
@ -373,7 +373,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
if let (Some(caller), Some(callee)) = (pointee_ty(caller.ty)?, pointee_ty(callee.ty)?) {
|
if let (Some(caller), Some(callee)) = (pointee_ty(caller.ty)?, pointee_ty(callee.ty)?) {
|
||||||
// This is okay if they have the same metadata type.
|
// This is okay if they have the same metadata type.
|
||||||
let meta_ty = |ty: Ty<'tcx>| {
|
let meta_ty = |ty: Ty<'tcx>| {
|
||||||
let (meta, only_if_sized) = ty.ptr_metadata_ty(*self.tcx, |ty| ty);
|
// Even if `ty` is normalized, the search for the unsized tail will project
|
||||||
|
// to fields, which can yield non-normalized types. So we need to provide a
|
||||||
|
// normalization function.
|
||||||
|
let normalize = |ty| self.tcx.normalize_erasing_regions(self.param_env, ty);
|
||||||
|
let (meta, only_if_sized) = ty.ptr_metadata_ty(*self.tcx, normalize);
|
||||||
assert!(
|
assert!(
|
||||||
!only_if_sized,
|
!only_if_sized,
|
||||||
"there should be no more 'maybe has that metadata' types during interpretation"
|
"there should be no more 'maybe has that metadata' types during interpretation"
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
// regression test for an ICE: https://github.com/rust-lang/miri/issues/3282
|
||||||
|
|
||||||
|
trait Id {
|
||||||
|
type Assoc: ?Sized;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: ?Sized> Id for T {
|
||||||
|
type Assoc = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
|
struct Foo<T: ?Sized> {
|
||||||
|
field: <T as Id>::Assoc,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = unsafe { std::mem::transmute::<fn(&str), fn(&Foo<str>)>(|_| ()) };
|
||||||
|
let foo: &Foo<str> = unsafe { &*("uwu" as *const str as *const Foo<str>) };
|
||||||
|
x(foo);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user