Skip to content

Commit 993299e

Browse files
committed
Auto merge of #15019 - HKalbasi:nightly-mir-eval-panic, r=HKalbasi
Fix panic in displaying const trait objects I hope this fixes the panic on recent nightly stdlib, but I didn't test it locally.
2 parents 60d952e + 6fbf6ef commit 993299e

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

crates/hir-ty/src/display.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,22 @@ fn render_const_scalar(
536536
}
537537
f.write_str("]")
538538
}
539+
TyKind::Dyn(_) => {
540+
let addr = usize::from_le_bytes(b[0..b.len() / 2].try_into().unwrap());
541+
let ty_id = usize::from_le_bytes(b[b.len() / 2..].try_into().unwrap());
542+
let Ok(t) = memory_map.vtable.ty(ty_id) else {
543+
return f.write_str("<ty-missing-in-vtable-map>");
544+
};
545+
let Ok(layout) = f.db.layout_of_ty(t.clone(), krate) else {
546+
return f.write_str("<layout-error>");
547+
};
548+
let size = layout.size.bytes_usize();
549+
let Some(bytes) = memory_map.get(addr, size) else {
550+
return f.write_str("<ref-data-not-available>");
551+
};
552+
f.write_str("&")?;
553+
render_const_scalar(f, bytes, memory_map, t)
554+
}
539555
_ => {
540556
let addr = usize::from_le_bytes(b.try_into().unwrap());
541557
let Ok(layout) = f.db.layout_of_ty(t.clone(), krate) else {

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ impl VTableMap {
7777
id
7878
}
7979

80-
fn ty(&self, id: usize) -> Result<&Ty> {
80+
pub(crate) fn ty(&self, id: usize) -> Result<&Ty> {
8181
self.id_to_ty.get(id).ok_or(MirEvalError::InvalidVTableId(id))
8282
}
8383

@@ -1571,24 +1571,32 @@ impl Evaluator<'_> {
15711571
}
15721572
None => {
15731573
let mut check_inner = None;
1574+
let (addr, meta) = bytes.split_at(bytes.len() / 2);
15741575
let element_size = match t.kind(Interner) {
15751576
TyKind::Str => 1,
15761577
TyKind::Slice(t) => {
15771578
check_inner = Some(t);
15781579
this.size_of_sized(t, locals, "slice inner type")?
15791580
}
1580-
_ => return Ok(()), // FIXME: support other kind of unsized types
1581+
TyKind::Dyn(_) => {
1582+
let t = this.vtable_map.ty_of_bytes(meta)?;
1583+
check_inner = Some(t);
1584+
this.size_of_sized(t, locals, "dyn concrete type")?
1585+
}
1586+
_ => return Ok(()),
1587+
};
1588+
let count = match t.kind(Interner) {
1589+
TyKind::Dyn(_) => 1,
1590+
_ => from_bytes!(usize, meta),
15811591
};
1582-
let (addr, meta) = bytes.split_at(bytes.len() / 2);
1583-
let count = from_bytes!(usize, meta);
15841592
let size = element_size * count;
15851593
let addr = Address::from_bytes(addr)?;
15861594
let b = this.read_memory(addr, size)?;
15871595
mm.insert(addr.to_usize(), b.to_vec());
15881596
if let Some(ty) = check_inner {
15891597
for i in 0..count {
15901598
let offset = element_size * i;
1591-
rec(this, &b[offset..offset + element_size], ty, locals, mm)?;
1599+
rec(this, &b[offset..offset + element_size], &ty, locals, mm)?;
15921600
}
15931601
}
15941602
}

crates/ide/src/hover/tests.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4422,6 +4422,29 @@ const FOO$0: Option<&i32> = Some(2).as_ref();
44224422
);
44234423
}
44244424

4425+
#[test]
4426+
fn hover_const_eval_dyn_trait() {
4427+
check(
4428+
r#"
4429+
//- minicore: fmt, coerce_unsized, builtin_impls
4430+
use core::fmt::Debug;
4431+
4432+
const FOO$0: &dyn Debug = &2i32;
4433+
"#,
4434+
expect![[r#"
4435+
*FOO*
4436+
4437+
```rust
4438+
test
4439+
```
4440+
4441+
```rust
4442+
const FOO: &dyn Debug = &2
4443+
```
4444+
"#]],
4445+
);
4446+
}
4447+
44254448
#[test]
44264449
fn hover_const_eval_slice() {
44274450
check(

0 commit comments

Comments
 (0)