Skip to content

Commit 5906c26

Browse files
committed
Auto merge of rust-lang#15565 - Veykril:mir, r=Veykril
Implement `write_via_move` intrinsic for mir-eval Required for getting `write!`ing to work again. we fail with an odd type mimsatch eval error after this change though
2 parents a843e46 + f13b184 commit 5906c26

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

crates/hir-ty/src/consteval/tests/intrinsics.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,24 @@ fn write_bytes() {
586586
);
587587
}
588588

589+
#[test]
590+
fn write_via_move() {
591+
check_number(
592+
r#"
593+
extern "rust-intrinsic" {
594+
fn write_via_move<T>(ptr: *mut T, value: T);
595+
}
596+
597+
const GOAL: i32 = unsafe {
598+
let mut x = 2;
599+
write_via_move(&mut x, 100);
600+
x
601+
};
602+
"#,
603+
100,
604+
);
605+
}
606+
589607
#[test]
590608
fn copy() {
591609
check_number(

crates/hir-ty/src/mir/eval/shim.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,6 +1200,22 @@ impl Evaluator<'_> {
12001200
let addr = Address::from_bytes(arg.interval.get(self)?)?;
12011201
destination.write_from_interval(self, Interval { addr, size: destination.size })
12021202
}
1203+
"write_via_move" => {
1204+
let [ptr, val] = args else {
1205+
return Err(MirEvalError::TypeError("write_via_move args are not provided"));
1206+
};
1207+
let dst = Address::from_bytes(ptr.get(self)?)?;
1208+
let Some(ty) =
1209+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
1210+
else {
1211+
return Err(MirEvalError::TypeError(
1212+
"write_via_copy generic arg is not provided",
1213+
));
1214+
};
1215+
let size = self.size_of_sized(ty, locals, "write_via_move ptr type")?;
1216+
Interval { addr: dst, size }.write_from_interval(self, val.interval)?;
1217+
Ok(())
1218+
}
12031219
"write_bytes" => {
12041220
let [dst, val, count] = args else {
12051221
return Err(MirEvalError::TypeError("write_bytes args are not provided"));

0 commit comments

Comments
 (0)