diff options
| author | Eduardo Sánchez Muñoz <eduardosm-dev@e64.io> | 2022-04-13 18:19:19 +0200 |
|---|---|---|
| committer | Eduardo Sánchez Muñoz <eduardosm-dev@e64.io> | 2022-04-14 19:35:40 +0200 |
| commit | c58af72a03b8215b70cfb33d358519917fc9458b (patch) | |
| tree | c5dfa0ff45e87a7292cb792843808d63178759fb | |
| parent | 2a91eeac1a2d27dd3de1bf55515d765da20fd86f (diff) | |
| download | rust-c58af72a03b8215b70cfb33d358519917fc9458b.tar.gz rust-c58af72a03b8215b70cfb33d358519917fc9458b.zip | |
Add additional `extract_field` / `project_field` to take into account extra level of struct nesting.
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/mir/place.rs | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/place.rs b/compiler/rustc_codegen_ssa/src/mir/place.rs index cf69c8fd8fd..b6a7bcae932 100644 --- a/compiler/rustc_codegen_ssa/src/mir/place.rs +++ b/compiler/rustc_codegen_ssa/src/mir/place.rs @@ -448,7 +448,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { // a box with a non-zst allocator should not be directly dereferenced if cg_base.layout.ty.is_box() && !cg_base.layout.field(cx, 1).is_zst() { - let ptr = cg_base.extract_field(bx, 0).extract_field(bx, 0); + // Extract `Box<T>` -> `Unique<T>` -> `NonNull<T>` -> `*const T` + let ptr = + cg_base.extract_field(bx, 0).extract_field(bx, 0).extract_field(bx, 0); ptr.deref(bx.cx()) } else { @@ -464,7 +466,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { mir::ProjectionElem::Deref => { // a box with a non-zst allocator should not be directly dereferenced if cg_base.layout.ty.is_box() && !cg_base.layout.field(cx, 1).is_zst() { - let ptr = cg_base.project_field(bx, 0).project_field(bx, 0); + // Project `Box<T>` -> `Unique<T>` -> `NonNull<T>` -> `*const T` + let ptr = + cg_base.project_field(bx, 0).project_field(bx, 0).project_field(bx, 0); bx.load_operand(ptr).deref(bx.cx()) } else { |
