From d85520202ab05f1d67da26e00905bf22c548b86f Mon Sep 17 00:00:00 2001
From: "Felix S. Klock II" <pnkfelix@pnkfx.org>
Date: Wed, 28 Jan 2015 03:37:24 +0100
Subject: [PATCH] In unsize_unique_expr, do not convert scratch value to
 lvalue.

Fix the issue-20055-box-trait.rs test to actually test `Box<Trait>`.

Fix #21695.
---
 src/librustc_trans/trans/expr.rs              |  5 ----
 src/test/run-pass/issue-20055-box-trait.rs    | 24 ++++++++++++-------
 .../run-pass/issue-20055-box-unsized-array.rs |  5 ++++
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/src/librustc_trans/trans/expr.rs b/src/librustc_trans/trans/expr.rs
index 3e60c0c541a..cde98154004 100644
--- a/src/librustc_trans/trans/expr.rs
+++ b/src/librustc_trans/trans/expr.rs
@@ -475,11 +475,6 @@ fn apply_adjustments<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
         let info = unsized_info(bcx, k, expr.id, unboxed_ty, |t| ty::mk_uniq(tcx, t));
         Store(bcx, info, get_len(bcx, scratch.val));
 
-        let scratch = unpack_datum!(bcx,
-                                    scratch.to_expr_datum().to_lvalue_datum(bcx,
-                                                                            "fresh_uniq_fat_ptr",
-                                                                            expr.id));
-
         DatumBlock::new(bcx, scratch.to_expr_datum())
     }
 }
diff --git a/src/test/run-pass/issue-20055-box-trait.rs b/src/test/run-pass/issue-20055-box-trait.rs
index fca63f91ca8..836e78b5b51 100644
--- a/src/test/run-pass/issue-20055-box-trait.rs
+++ b/src/test/run-pass/issue-20055-box-trait.rs
@@ -8,6 +8,14 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// See Issues #20055 and #21695.
+
+// We are checking here that the temporaries `Box<[i8, k]>`, for `k`
+// in 1, 2, 3, 4, that are induced by the match expression are
+// properly handled, in that only *one* will be initialized by
+// whichever arm is run, and subsequently dropped at the end of the
+// statement surrounding the `match`.
+
 trait Boo { }
 
 impl Boo for [i8; 1] { }
@@ -16,12 +24,12 @@ impl Boo for [i8; 3] { }
 impl Boo for [i8; 4] { }
 
 pub fn foo(box_1: fn () -> Box<[i8; 1]>,
-           box_2: fn () -> Box<[i8; 20]>,
-           box_3: fn () -> Box<[i8; 300]>,
-           box_4: fn () -> Box<[i8; 4000]>,
+           box_2: fn () -> Box<[i8; 2]>,
+           box_3: fn () -> Box<[i8; 3]>,
+           box_4: fn () -> Box<[i8; 4]>,
             ) {
     println!("Hello World 1");
-    let _: Box<[i8]> = match 3 {
+    let _: Box<Boo> = match 3 {
         1 => box_1(),
         2 => box_2(),
         3 => box_3(),
@@ -31,10 +39,10 @@ pub fn foo(box_1: fn () -> Box<[i8; 1]>,
 }
 
 pub fn main() {
-    fn box_1() -> Box<[i8; 1]> { Box::new( [1i8] ) }
-    fn box_2() -> Box<[i8; 20]> { Box::new( [1i8; 20] ) }
-    fn box_3() -> Box<[i8; 300]> { Box::new( [1i8; 300] ) }
-    fn box_4() -> Box<[i8; 4000]> { Box::new( [1i8; 4000] ) }
+    fn box_1() -> Box<[i8; 1]> { Box::new( [1i8; 1] ) }
+    fn box_2() -> Box<[i8; 2]> { Box::new( [1i8; 2] ) }
+    fn box_3() -> Box<[i8; 3]> { Box::new( [1i8; 3] ) }
+    fn box_4() -> Box<[i8; 4]> { Box::new( [1i8; 4] ) }
 
     foo(box_1, box_2, box_3, box_4);
 }
diff --git a/src/test/run-pass/issue-20055-box-unsized-array.rs b/src/test/run-pass/issue-20055-box-unsized-array.rs
index 2f3f737d1a7..f751be6f13b 100644
--- a/src/test/run-pass/issue-20055-box-unsized-array.rs
+++ b/src/test/run-pass/issue-20055-box-unsized-array.rs
@@ -8,6 +8,11 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// Issue #2005: Check that boxed fixed-size arrays are properly
+// accounted for (namely, only deallocated if they were actually
+// created) when they appear as temporaries in unused arms of a match
+// expression.
+
 pub fn foo(box_1: fn () -> Box<[i8; 1]>,
            box_2: fn () -> Box<[i8; 20]>,
            box_3: fn () -> Box<[i8; 300]>,