mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 06:23:25 +00:00
Support enum in memory map patch address
This commit is contained in:
parent
31c30933cf
commit
021802c59c
2 changed files with 26 additions and 5 deletions
|
@ -2441,14 +2441,14 @@ fn const_loop() {
|
||||||
fn const_transfer_memory() {
|
fn const_transfer_memory() {
|
||||||
check_number(
|
check_number(
|
||||||
r#"
|
r#"
|
||||||
//- minicore: slice, index, coerce_unsized
|
//- minicore: slice, index, coerce_unsized, option
|
||||||
const A1: &i32 = &1;
|
const A1: &i32 = &1;
|
||||||
const A2: &i32 = &10;
|
const A2: &i32 = &10;
|
||||||
const A3: [&i32; 3] = [&1, &2, &100];
|
const A3: [&i32; 3] = [&1, &2, &100];
|
||||||
const A4: (i32, &i32) = (1, &1000);
|
const A4: (i32, &i32, Option<&i32>) = (1, &1000, Some(&10000));
|
||||||
const GOAL: i32 = *A1 + *A2 + *A3[2] + *A4.1;
|
const GOAL: i32 = *A1 + *A2 + *A3[2] + *A4.1 + *A4.2.unwrap_or(&5);
|
||||||
"#,
|
"#,
|
||||||
1111,
|
11111,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2007,7 +2007,28 @@ impl Evaluator<'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AdtId::UnionId(_) => (),
|
AdtId::UnionId(_) => (),
|
||||||
AdtId::EnumId(_) => (),
|
AdtId::EnumId(e) => {
|
||||||
|
if let Some((variant, layout)) = detect_variant_from_bytes(
|
||||||
|
&layout,
|
||||||
|
self.db,
|
||||||
|
self.trait_env.clone(),
|
||||||
|
self.read_memory(addr, layout.size.bytes_usize())?,
|
||||||
|
e,
|
||||||
|
) {
|
||||||
|
let ev = EnumVariantId { parent: e, local_id: variant };
|
||||||
|
for (i, (_, ty)) in self.db.field_types(ev.into()).iter().enumerate() {
|
||||||
|
let offset = layout.fields.offset(i).bytes_usize();
|
||||||
|
let ty = ty.clone().substitute(Interner, subst);
|
||||||
|
self.patch_addresses(
|
||||||
|
patch_map,
|
||||||
|
old_vtable,
|
||||||
|
addr.offset(offset),
|
||||||
|
&ty,
|
||||||
|
locals,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
TyKind::Tuple(_, subst) => {
|
TyKind::Tuple(_, subst) => {
|
||||||
for (id, ty) in subst.iter(Interner).enumerate() {
|
for (id, ty) in subst.iter(Interner).enumerate() {
|
||||||
|
|
Loading…
Reference in a new issue