about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEduard Burtescu <edy.burt@gmail.com>2016-03-10 06:35:41 +0200
committerEduard Burtescu <edy.burt@gmail.com>2016-03-17 22:48:07 +0200
commit5f990fb4f000077216d96bf31ea33623a9875e9e (patch)
treecba3fcf508a455ee09a6f1275f509fce039c195e /src
parentcfd768e2e69a3ca8f28d7bc49f2ae3ca744841c8 (diff)
downloadrust-5f990fb4f000077216d96bf31ea33623a9875e9e.tar.gz
rust-5f990fb4f000077216d96bf31ea33623a9875e9e.zip
mir: Don't forget to drop arguments.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/build/mod.rs5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs
index 7fd959390de..b40775f939f 100644
--- a/src/librustc_mir/build/mod.rs
+++ b/src/librustc_mir/build/mod.rs
@@ -141,14 +141,17 @@ impl<'a,'tcx> Builder<'a,'tcx> {
                 .chain(explicits)
                 .enumerate()
                 .map(|(index, (ty, pattern))| {
+                    let lvalue = Lvalue::Arg(index as u32);
                     if let Some(pattern) = pattern {
-                        let lvalue = Lvalue::Arg(index as u32);
                         let pattern = this.hir.irrefutable_pat(pattern);
                         unpack!(block = this.lvalue_into_pattern(block,
                                                                  argument_extent,
                                                                  pattern,
                                                                  &lvalue));
                     }
+                    // Make sure we drop (parts of) the argument even when not matched on.
+                    this.schedule_drop(pattern.as_ref().map_or(ast_block.span, |pat| pat.span),
+                                       argument_extent, &lvalue, ty);
                     ArgDecl { ty: ty, spread: false }
                 })
                 .collect();