Skip to content

Commit 15f4eec

Browse files
committed
Leave FIXME for wasm layout difference.
There is a distinction between running this on wasm and i686, even though they should be identical. This technically is not _incorrect_, it's just an unexpected difference, which is worth investigating, but not for correctness.
1 parent 610e1a1 commit 15f4eec

11 files changed

+297
-315
lines changed

compiler/rustc_mir_transform/src/large_enums.rs

+27-15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::rustc_middle::ty::util::IntTypeExt;
22
use crate::MirPass;
3-
use rustc_data_structures::stable_map::FxHashMap;
3+
use rustc_data_structures::fx::FxHashMap;
44
use rustc_middle::mir::interpret::AllocId;
55
use rustc_middle::mir::*;
66
use rustc_middle::ty::{self, AdtDef, Const, ParamEnv, Ty, TyCtxt};
@@ -19,14 +19,21 @@ use rustc_target::abi::{HasDataLayout, Size, TagEncoding, Variants};
1919
/// Instead of emitting moves of the large variant,
2020
/// Perform a memcpy instead.
2121
/// Based off of [this HackMD](https://hackmd.io/@ft4bxUsFT5CEUBmRKYHr7w/rJM8BBPzD).
22+
///
23+
/// In summary, what this does is at runtime determine which enum variant is active,
24+
/// and instead of copying all the bytes of the largest possible variant,
25+
/// copy only the bytes for the currently active variant.
2226
pub struct EnumSizeOpt {
2327
pub(crate) discrepancy: u64,
2428
}
2529

2630
impl<'tcx> MirPass<'tcx> for EnumSizeOpt {
2731
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
2832
let sess = tcx.sess;
29-
if (!sess.opts.debugging_opts.unsound_mir_opts) || sess.mir_opt_level() < 3 {
33+
// FIXME(julianknodt): one thing noticed while testing this mir-opt is that there is a
34+
// different layout of large enums on wasm. It's not clear what is causing this layout
35+
// difference, as it should be identical to i686 (32 bit).
36+
if (!sess.opts.unstable_opts.unsound_mir_opts) || sess.mir_opt_level() < 3 {
3037
return;
3138
}
3239
self.optim(tcx, body);
@@ -56,8 +63,8 @@ impl EnumSizeOpt {
5663
Variants::Multiple { variants, .. } if variants.len() <= 1 => return None,
5764
Variants::Multiple { variants, .. } => variants,
5865
};
59-
let min = variants.iter().map(|v| v.size()).min().unwrap();
60-
let max = variants.iter().map(|v| v.size()).max().unwrap();
66+
let min = variants.iter().map(|v| v.size).min().unwrap();
67+
let max = variants.iter().map(|v| v.size).max().unwrap();
6168
if max.bytes() - min.bytes() < self.discrepancy {
6269
return None;
6370
}
@@ -92,7 +99,7 @@ impl EnumSizeOpt {
9299
for (var_idx, layout) in variants.iter_enumerated() {
93100
let curr_idx =
94101
target_bytes * adt_def.discriminant_for_variant(tcx, var_idx).val as usize;
95-
let sz = layout.size();
102+
let sz = layout.size;
96103
match ptr_sized_int {
97104
rustc_target::abi::Integer::I32 => {
98105
encode_store!(curr_idx, data_layout.endian, sz.bytes() as u32);
@@ -115,8 +122,11 @@ impl EnumSizeOpt {
115122
let mut alloc_cache = FxHashMap::default();
116123
let body_did = body.source.def_id();
117124
let param_env = tcx.param_env(body_did);
118-
let (bbs, local_decls) = body.basic_blocks_and_local_decls_mut();
119-
for bb in bbs {
125+
126+
let blocks = body.basic_blocks.as_mut();
127+
let local_decls = &mut body.local_decls;
128+
129+
for bb in blocks {
120130
bb.expand_statements(|st| {
121131
if let StatementKind::Assign(box (
122132
lhs,
@@ -175,7 +185,7 @@ impl EnumSizeOpt {
175185
kind: StatementKind::Assign(box (
176186
discr_cast_place,
177187
Rvalue::Cast(
178-
CastKind::Misc,
188+
CastKind::IntToInt,
179189
Operand::Copy(discr_place),
180190
tcx.types.usize,
181191
),
@@ -217,7 +227,7 @@ impl EnumSizeOpt {
217227
source_info,
218228
kind: StatementKind::Assign(box (
219229
dst_cast_place,
220-
Rvalue::Cast(CastKind::Misc, Operand::Copy(dst), dst_cast_ty),
230+
Rvalue::Cast(CastKind::PtrToPtr, Operand::Copy(dst), dst_cast_ty),
221231
)),
222232
};
223233

@@ -240,17 +250,19 @@ impl EnumSizeOpt {
240250
source_info,
241251
kind: StatementKind::Assign(box (
242252
src_cast_place,
243-
Rvalue::Cast(CastKind::Misc, Operand::Copy(src), src_cast_ty),
253+
Rvalue::Cast(CastKind::PtrToPtr, Operand::Copy(src), src_cast_ty),
244254
)),
245255
};
246256

247257
let copy_bytes = Statement {
248258
source_info,
249-
kind: StatementKind::CopyNonOverlapping(box CopyNonOverlapping {
250-
src: Operand::Copy(src_cast_place),
251-
dst: Operand::Copy(dst_cast_place),
252-
count: Operand::Copy(size_place),
253-
}),
259+
kind: StatementKind::Intrinsic(
260+
box NonDivergingIntrinsic::CopyNonOverlapping(CopyNonOverlapping {
261+
src: Operand::Copy(src_cast_place),
262+
dst: Operand::Copy(dst_cast_place),
263+
count: Operand::Copy(size_place),
264+
}),
265+
),
254266
};
255267

256268
let store_dead = Statement {

compiler/rustc_mir_transform/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#![allow(rustc::potential_query_instability)]
22
#![feature(box_patterns)]
33
#![feature(drain_filter)]
4+
#![feature(box_syntax)]
45
#![feature(let_chains)]
5-
#![feature(let_else)]
66
#![feature(map_try_insert)]
77
#![feature(min_specialization)]
88
#![feature(never_type)]

tests/mir-opt/enum_opt.cand.EnumSizeOpt.32bit.diff

+40-44
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,50 @@
22
+ // MIR for `cand` after EnumSizeOpt
33

44
fn cand() -> () {
5-
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:50:15: 50:15
6-
let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:51:7: 51:12
7-
let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:52:7: 52:34
8-
let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:52:24: 52:33
9-
+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
10-
+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
11-
+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
12-
+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
13-
+ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
14-
+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
15-
+ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
16-
+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
5+
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15
6+
let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12
7+
let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:34
8+
let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:24: +2:33
9+
+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
10+
+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
11+
+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
12+
+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
13+
+ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
14+
+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
15+
+ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
16+
+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
1717
scope 1 {
18-
debug a => _1; // in scope 1 at $DIR/enum_opt.rs:51:7: 51:12
18+
debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12
1919
}
2020

2121
bb0: {
22-
StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:51:7: 51:12
23-
Deinit(_1); // scope 0 at $DIR/enum_opt.rs:51:15: 51:34
24-
((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34
25-
discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34
26-
StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
27-
StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:52:24: 52:33
28-
_3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:52:24: 52:33
29-
Deinit(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
30-
((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
31-
discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
32-
StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34
33-
- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
34-
+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
35-
+ _4 = const [2_usize, 8196_usize]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
36-
+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
37-
+ _6 = _5 as usize (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
38-
+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
39-
+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
40-
+ _9 = _8 as *mut u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
41-
+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
42-
+ _11 = _10 as *const u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
43-
+ copy_nonoverlapping(src=_11, dst=_9, count=_7); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
44-
+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
45-
StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34
46-
_0 = const (); // scope 0 at $DIR/enum_opt.rs:50:15: 53:2
47-
StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:53:1: 53:2
48-
return; // scope 0 at $DIR/enum_opt.rs:53:2: 53:2
49-
}
50-
51-
bb1 (cleanup): {
52-
resume; // scope 0 at $DIR/enum_opt.rs:50:1: 53:2
22+
StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12
23+
Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34
24+
((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34
25+
discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34
26+
StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
27+
StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33
28+
_3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33
29+
Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
30+
((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
31+
discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
32+
StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34
33+
- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
34+
+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
35+
+ _4 = const [2_usize, 8196_usize]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
36+
+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
37+
+ _6 = _5 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
38+
+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
39+
+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
40+
+ _9 = _8 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
41+
+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
42+
+ _11 = _10 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
43+
+ copy_nonoverlapping(dst = _9, src = _11, count = _7); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
44+
+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
45+
StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34
46+
_0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:15: +3:2
47+
StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2
48+
return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2
5349
}
5450
}
5551

tests/mir-opt/enum_opt.cand.EnumSizeOpt.64bit.diff

+40-44
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,50 @@
22
+ // MIR for `cand` after EnumSizeOpt
33

44
fn cand() -> () {
5-
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:50:15: 50:15
6-
let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:51:7: 51:12
7-
let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:52:7: 52:34
8-
let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:52:24: 52:33
9-
+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
10-
+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
11-
+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
12-
+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
13-
+ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
14-
+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
15-
+ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
16-
+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34
5+
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15
6+
let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12
7+
let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:34
8+
let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:24: +2:33
9+
+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
10+
+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
11+
+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
12+
+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
13+
+ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
14+
+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
15+
+ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
16+
+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34
1717
scope 1 {
18-
debug a => _1; // in scope 1 at $DIR/enum_opt.rs:51:7: 51:12
18+
debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12
1919
}
2020

2121
bb0: {
22-
StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:51:7: 51:12
23-
Deinit(_1); // scope 0 at $DIR/enum_opt.rs:51:15: 51:34
24-
((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34
25-
discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34
26-
StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
27-
StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:52:24: 52:33
28-
_3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:52:24: 52:33
29-
Deinit(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
30-
((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
31-
discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34
32-
StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34
33-
- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
34-
+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
35-
+ _4 = const [2_usize, 8200_usize]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
36-
+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
37-
+ _6 = _5 as usize (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
38-
+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
39-
+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
40-
+ _9 = _8 as *mut u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
41-
+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
42-
+ _11 = _10 as *const u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
43-
+ copy_nonoverlapping(src=_11, dst=_9, count=_7); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
44-
+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34
45-
StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34
46-
_0 = const (); // scope 0 at $DIR/enum_opt.rs:50:15: 53:2
47-
StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:53:1: 53:2
48-
return; // scope 0 at $DIR/enum_opt.rs:53:2: 53:2
49-
}
50-
51-
bb1 (cleanup): {
52-
resume; // scope 0 at $DIR/enum_opt.rs:50:1: 53:2
22+
StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12
23+
Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34
24+
((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34
25+
discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34
26+
StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
27+
StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33
28+
_3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33
29+
Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
30+
((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
31+
discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34
32+
StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34
33+
- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
34+
+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
35+
+ _4 = const [2_usize, 8200_usize]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
36+
+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
37+
+ _6 = _5 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
38+
+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
39+
+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
40+
+ _9 = _8 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
41+
+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
42+
+ _11 = _10 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
43+
+ copy_nonoverlapping(dst = _9, src = _11, count = _7); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
44+
+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34
45+
StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34
46+
_0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:15: +3:2
47+
StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2
48+
return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2
5349
}
5450
}
5551

0 commit comments

Comments
 (0)