Skip to content

Commit 06070f3

Browse files
authored
Merge pull request #22594 from Wilfred/const_eval_crash
fix: MIR eval mixed bit and byte sizes
2 parents 888f581 + f221318 commit 06070f3

2 files changed

Lines changed: 44 additions & 21 deletions

File tree

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2633,6 +2633,19 @@ fn const_generic_subst_fn() {
26332633
);
26342634
}
26352635

2636+
#[test]
2637+
fn const_generic_fixed_width() {
2638+
check_number(
2639+
r#"
2640+
const fn m<const N: u64>() -> u64 {
2641+
N
2642+
}
2643+
const GOAL: u64 = m::<0>();
2644+
"#,
2645+
0,
2646+
);
2647+
}
2648+
26362649
#[test]
26372650
fn layout_of_type_with_associated_type_field_defined_inside_body() {
26382651
check_number(

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

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,25 +1935,37 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
19351935
Ok(Interval::new(addr, 4))
19361936
}
19371937
TyKind::Int(int_ty) => {
1938-
let size = int_ty.bit_width().unwrap_or(self.ptr_size() as u64);
1939-
let value = valtree.inner().to_leaf().to_int(Size::from_bytes(size));
1940-
let addr = self.heap_allocate(size as usize, size as usize)?;
1941-
self.write_memory(addr, &value.to_le_bytes()[..size as usize])?;
1942-
Ok(Interval::new(addr, size as usize))
1938+
let size = int_ty
1939+
.bit_width()
1940+
.map(Size::from_bits)
1941+
.unwrap_or_else(|| Size::from_bytes(self.ptr_size() as u64));
1942+
let bytes = size.bytes_usize();
1943+
1944+
let value = valtree.inner().to_leaf().to_int(size);
1945+
let addr = self.heap_allocate(bytes, bytes)?;
1946+
self.write_memory(addr, &value.to_le_bytes()[..bytes])?;
1947+
Ok(Interval::new(addr, bytes))
19431948
}
19441949
TyKind::Uint(uint_ty) => {
1945-
let size = uint_ty.bit_width().unwrap_or(self.ptr_size() as u64);
1946-
let value = valtree.inner().to_leaf().to_uint(Size::from_bytes(size));
1947-
let addr = self.heap_allocate(size as usize, size as usize)?;
1948-
self.write_memory(addr, &value.to_le_bytes()[..size as usize])?;
1949-
Ok(Interval::new(addr, size as usize))
1950+
let size = uint_ty
1951+
.bit_width()
1952+
.map(Size::from_bits)
1953+
.unwrap_or_else(|| Size::from_bytes(self.ptr_size() as u64));
1954+
let bytes = size.bytes_usize();
1955+
1956+
let value = valtree.inner().to_leaf().to_uint(size);
1957+
let addr = self.heap_allocate(bytes, bytes)?;
1958+
self.write_memory(addr, &value.to_le_bytes()[..bytes])?;
1959+
Ok(Interval::new(addr, bytes))
19501960
}
19511961
TyKind::Float(float_ty) => {
1952-
let size = float_ty.bit_width();
1953-
let value = valtree.inner().to_leaf().to_uint(Size::from_bytes(size));
1954-
let addr = self.heap_allocate(size as usize, size as usize)?;
1955-
self.write_memory(addr, &value.to_le_bytes()[..size as usize])?;
1956-
Ok(Interval::new(addr, size as usize))
1962+
let size = Size::from_bits(float_ty.bit_width());
1963+
let bytes = size.bytes_usize();
1964+
1965+
let value = valtree.inner().to_leaf().to_uint(size);
1966+
let addr = self.heap_allocate(bytes, bytes)?;
1967+
self.write_memory(addr, &value.to_le_bytes()[..bytes])?;
1968+
Ok(Interval::new(addr, bytes))
19571969
}
19581970
TyKind::RawPtr(..) => {
19591971
let size = self.ptr_size();
@@ -1995,15 +2007,13 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
19952007
_ => not_supported!("unsupported const"),
19962008
})
19972009
.collect::<Result<'_, Vec<_>>>()?;
2010+
let item_size = item_layout.size.bytes_usize();
19982011
let items_addr = self.heap_allocate(
1999-
items.len() * (item_layout.size.bits() as usize),
2000-
item_layout.align.bits_usize(),
2012+
items.len() * item_size,
2013+
item_layout.align.bytes() as usize,
20012014
)?;
20022015
for (i, item) in items.iter().enumerate() {
2003-
self.copy_from_interval(
2004-
items_addr.offset(i * (item_layout.size.bits() as usize)),
2005-
*item,
2006-
)?;
2016+
self.copy_from_interval(items_addr.offset(i * item_size), *item)?;
20072017
}
20082018
let ref_addr = self.heap_allocate(self.ptr_size() * 2, self.ptr_size())?;
20092019
self.write_memory(ref_addr, &items_addr.to_bytes())?;

0 commit comments

Comments
 (0)