From e7c6ad89cfd937d741b9d256e950ec0de96a7142 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Tue, 14 Mar 2023 22:24:28 -0700 Subject: Improved implementation and comments after code review feedback --- .../rustc_mir_transform/src/lower_intrinsics.rs | 31 +++++++++++++--------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'compiler/rustc_mir_transform/src') diff --git a/compiler/rustc_mir_transform/src/lower_intrinsics.rs b/compiler/rustc_mir_transform/src/lower_intrinsics.rs index 151fff27d14..5d7382305ae 100644 --- a/compiler/rustc_mir_transform/src/lower_intrinsics.rs +++ b/compiler/rustc_mir_transform/src/lower_intrinsics.rs @@ -150,7 +150,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics { } } sym::read_via_copy => { - let Ok([arg]) = <[_; 1]>::try_from(std::mem::take(args)) else { + let [arg] = args.as_slice() else { span_bug!(terminator.source_info.span, "Wrong number of arguments"); }; let derefed_place = @@ -159,18 +159,23 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics { } else { span_bug!(terminator.source_info.span, "Only passing a local is supported"); }; - block.statements.push(Statement { - source_info: terminator.source_info, - kind: StatementKind::Assign(Box::new(( - *destination, - Rvalue::Use(Operand::Copy(derefed_place)), - ))), - }); - if let Some(target) = *target { - terminator.kind = TerminatorKind::Goto { target }; - } else { - // Reading something uninhabited means this is unreachable. - terminator.kind = TerminatorKind::Unreachable; + terminator.kind = match *target { + None => { + // No target means this read something uninhabited, + // so it must be unreachable, and we don't need to + // preserve the assignment either. + TerminatorKind::Unreachable + } + Some(target) => { + block.statements.push(Statement { + source_info: terminator.source_info, + kind: StatementKind::Assign(Box::new(( + *destination, + Rvalue::Use(Operand::Copy(derefed_place)), + ))), + }); + TerminatorKind::Goto { target } + } } } sym::discriminant_value => { -- cgit 1.4.1-3-g733a5