about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Woerister <michaelwoerister@posteo.net>2016-09-13 22:09:22 -0400
committerMichael Woerister <michaelwoerister@posteo.net>2016-09-13 22:11:01 -0400
commit1b3a588f55c84d4fc36f4889f4c7ef7357ad471a (patch)
tree2018bbf21002b50de65786c3236fdd2bf3b7098c
parentc87ba3f1222ba20d491e8ed76a04977283280742 (diff)
downloadrust-1b3a588f55c84d4fc36f4889f4c7ef7357ad471a.tar.gz
rust-1b3a588f55c84d4fc36f4889f4c7ef7357ad471a.zip
trans: Let the collector find drop-glue for all vtables, not just VTableImpl.
-rw-r--r--src/librustc_trans/collector.rs13
-rw-r--r--src/test/codegen-units/item-collection/instantiation-through-vtable.rs2
-rw-r--r--src/test/codegen-units/item-collection/unsizing.rs2
-rw-r--r--src/test/codegen-units/partitioning/vtable-through-const.rs2
-rw-r--r--src/test/run-pass/issue36260.rs22
5 files changed, 29 insertions, 12 deletions
diff --git a/src/librustc_trans/collector.rs b/src/librustc_trans/collector.rs
index 5a8ab62a2aa..a58de71ca41 100644
--- a/src/librustc_trans/collector.rs
+++ b/src/librustc_trans/collector.rs
@@ -497,7 +497,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> {
                                                           self.output);
                 }
             }
-            mir::Rvalue::Box(_) => {
+            mir::Rvalue::Box(..) => {
                 let exchange_malloc_fn_def_id =
                     self.scx
                         .tcx()
@@ -1072,15 +1072,16 @@ fn create_trans_items_for_vtable_methods<'a, 'tcx>(scx: &SharedCrateContext<'a,
                         });
 
                     output.extend(items);
-
-                    // Also add the destructor
-                    let dg_type = glue::get_drop_glue_type(scx.tcx(),
-                                                           trait_ref.self_ty());
-                    output.push(TransItem::DropGlue(DropGlueKind::Ty(dg_type)));
                 }
                 _ => { /* */ }
             }
         }
+
+        // Also add the destructor
+        let dg_type = glue::get_drop_glue_type(scx.tcx(), impl_ty);
+        if glue::type_needs_drop(scx.tcx(), dg_type) {
+            output.push(TransItem::DropGlue(DropGlueKind::Ty(dg_type)));
+        }
     }
 }
 
diff --git a/src/test/codegen-units/item-collection/instantiation-through-vtable.rs b/src/test/codegen-units/item-collection/instantiation-through-vtable.rs
index 06e547f0dd0..b7725251220 100644
--- a/src/test/codegen-units/item-collection/instantiation-through-vtable.rs
+++ b/src/test/codegen-units/item-collection/instantiation-through-vtable.rs
@@ -40,5 +40,3 @@ fn main() {
     //~ TRANS_ITEM fn instantiation_through_vtable::{{impl}}[0]::bar[0]<u64>
     let _ = &s1 as &Trait;
 }
-
-//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/item-collection/unsizing.rs b/src/test/codegen-units/item-collection/unsizing.rs
index 5c67ab7a826..45ba441bc8b 100644
--- a/src/test/codegen-units/item-collection/unsizing.rs
+++ b/src/test/codegen-units/item-collection/unsizing.rs
@@ -78,5 +78,3 @@ fn main()
     //~ TRANS_ITEM fn unsizing::{{impl}}[3]::foo[0]
     let _wrapper_sized = wrapper_sized as Wrapper<Trait>;
 }
-
-//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/vtable-through-const.rs b/src/test/codegen-units/partitioning/vtable-through-const.rs
index b40bb7f6097..ee5e97cd9c2 100644
--- a/src/test/codegen-units/partitioning/vtable-through-const.rs
+++ b/src/test/codegen-units/partitioning/vtable-through-const.rs
@@ -89,5 +89,3 @@ fn main() {
     //~ TRANS_ITEM fn vtable_through_const::mod1[0]::id[0]<char> @@ vtable_through_const[Internal]
     mod1::ID_CHAR('x');
 }
-
-//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/run-pass/issue36260.rs b/src/test/run-pass/issue36260.rs
new file mode 100644
index 00000000000..08dbbb5c9fe
--- /dev/null
+++ b/src/test/run-pass/issue36260.rs
@@ -0,0 +1,22 @@
+// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Make sure this compiles without getting a linker error because of missing
+// drop-glue because the collector missed adding drop-glue for the closure:
+
+fn create_fn() -> Box<Fn()> {
+    let text = String::new();
+
+    Box::new(move || { let _ = &text; })
+}
+
+fn main() {
+    let _ = create_fn();
+}