Fix transmute intrinsic mir validation ICE
This commit is contained in:
parent
696aaad58c
commit
d8ed2fb0bb
@ -679,13 +679,21 @@ macro_rules! check_kinds {
|
||||
// Unlike `mem::transmute`, a MIR `Transmute` is well-formed
|
||||
// for any two `Sized` types, just potentially UB to run.
|
||||
|
||||
if !op_ty.is_sized(self.tcx, self.param_env) {
|
||||
if !self
|
||||
.tcx
|
||||
.normalize_erasing_regions(self.param_env, op_ty)
|
||||
.is_sized(self.tcx, self.param_env)
|
||||
{
|
||||
self.fail(
|
||||
location,
|
||||
format!("Cannot transmute from non-`Sized` type {op_ty:?}"),
|
||||
);
|
||||
}
|
||||
if !target_type.is_sized(self.tcx, self.param_env) {
|
||||
if !self
|
||||
.tcx
|
||||
.normalize_erasing_regions(self.param_env, *target_type)
|
||||
.is_sized(self.tcx, self.param_env)
|
||||
{
|
||||
self.fail(
|
||||
location,
|
||||
format!("Cannot transmute to non-`Sized` type {target_type:?}"),
|
||||
|
17
tests/ui/mir/validate/transmute_cast_sized.rs
Normal file
17
tests/ui/mir/validate/transmute_cast_sized.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// build-pass
|
||||
// compile-flags: -Zvalidate-mir
|
||||
// edition: 2021
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// Use `PhantomData` to get target-independent size
|
||||
async fn get(_r: std::marker::PhantomData<&i32>) {
|
||||
loop {}
|
||||
}
|
||||
|
||||
pub fn check() {
|
||||
let mut v = get(loop {});
|
||||
let _ = || unsafe {
|
||||
v = std::mem::transmute([0_u8; 1]);
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue
Block a user