From 4dc028743dad4d2d71842c2bb20029b412edaca7 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Thu, 25 Oct 2018 19:37:07 +0200 Subject: [PATCH] Explain why we can encounter a `Goto` terminator that we want to promote --- src/librustc_mir/transform/promote_consts.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/transform/promote_consts.rs b/src/librustc_mir/transform/promote_consts.rs index bba9260f2b82..1d45850a080d 100644 --- a/src/librustc_mir/transform/promote_consts.rs +++ b/src/librustc_mir/transform/promote_consts.rs @@ -332,7 +332,13 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { let operand = Operand::Copy(promoted_place(ty, span)); mem::replace(&mut args[index], operand) } - // already promoted out + // We expected a `TerminatorKind::Call` for which we'd like to promote an + // argument. Since `qualify_consts` saw a `TerminatorKind::Call` here, but + // we are seeing a `Goto`, that means that the `promote_temps` method + // already promoted this call away entirely. This case occurs when calling + // a function requiring a constant argument and as that constant value + // providing a value whose computation contains another call to a function + // requiring a constant argument. TerminatorKind::Goto { .. } => return, _ => bug!() }