From 52b53629901f2f797bf0191afdaba380234f81ad Mon Sep 17 00:00:00 2001 From: Remy Rakic Date: Fri, 14 Sep 2018 18:07:17 +0200 Subject: [PATCH] Explain the fake read injection better --- src/librustc_mir/build/matches/mod.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/librustc_mir/build/matches/mod.rs b/src/librustc_mir/build/matches/mod.rs index 91d439d430c2..5c72679800c4 100644 --- a/src/librustc_mir/build/matches/mod.rs +++ b/src/librustc_mir/build/matches/mod.rs @@ -265,9 +265,20 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { self.storage_live_binding(block, var, irrefutable_pat.span, OutsideGuard); unpack!(block = self.into(&place, block, initializer)); - // Inject a fake read of the newly created binding - // to test the fallout of fixing issue #53695 where NLL - // allows creating unused variables that are effectively unusable. + + // Officially, the semantics of + // + // `let pattern = ;` + // + // is that `` is evaluated into a temporary and then this temporary is + // into the pattern. + // + // However, if we see the simple pattern `let var = `, we optimize this to + // evaluate `` directly into the variable `var`. This is mostly unobservable, + // but in some cases it can affect the borrow checker, as in #53695. + // Therefore, we insert a "fake read" here to ensure that we get + // appropriate errors. + // let source_info = self.source_info(irrefutable_pat.span); self.cfg.push( block, @@ -318,9 +329,9 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { }, ); - // Inject a fake read of the newly created binding - // to test the fallout of fixing issue #53695 where NLL - // allows creating unused variables that are effectively unusable. + // Similarly to the `let var = ` case, we insert a "fake read" here to + // ensure that we get appropriate errors when this usually unobservable + // optimization affects the borrow checker. self.cfg.push( block, Statement {