Traverse types in reachability

Issue 2526 showed a test case where a library exported only a type
that was a synonym for a class. Because the class's destructor wasn't
getting marked as reachable, its linkage was wrongly getting set to
"internal". The solution is for reachability to traverse types.

Closes #2526.
This commit is contained in:
Tim Chevalier 2012-06-13 11:20:21 -07:00
parent cce7327487
commit 6f95c79b95
3 changed files with 67 additions and 1 deletions

View file

@ -135,11 +135,37 @@ fn traverse_public_item(cx: ctx, item: @item) {
} }
} }
} }
item_const(*) | item_ty(*) | item_ty(t, _, _) {
traverse_ty(t, cx, mk_ty_visitor());
}
item_const(*) |
item_enum(*) | item_iface(*) {} item_enum(*) | item_iface(*) {}
} }
} }
fn mk_ty_visitor() -> visit::vt<ctx> {
visit::mk_vt(@{visit_ty: traverse_ty with *visit::default_visitor()})
}
fn traverse_ty(ty: @ty, cx: ctx, v: visit::vt<ctx>) {
if cx.rmap.contains_key(ty.id) { ret; }
cx.rmap.insert(ty.id, ());
alt ty.node {
ty_path(p, p_id) {
alt cx.tcx.def_map.find(p_id) {
// Kind of a hack to check this here, but I'm not sure what else
// to do
some(def_prim_ty(_)) { /* do nothing */ }
some(d) { traverse_def_id(cx, def_id_of_def(d)); }
none { /* do nothing -- but should we fail here? */ }
}
for p.types.each {|t| v.visit_ty(t, cx, v); };
}
_ { visit::visit_ty(ty, cx, v); }
}
}
fn traverse_inline_body(cx: ctx, body: blk) { fn traverse_inline_body(cx: ctx, body: blk) {
fn traverse_expr(e: @expr, cx: ctx, v: visit::vt<ctx>) { fn traverse_expr(e: @expr, cx: ctx, v: visit::vt<ctx>) {
alt e.node { alt e.node {

View file

@ -0,0 +1,32 @@
#[link(name = "zmq",
vers = "0.2",
uuid = "54cc1bc9-02b8-447c-a227-75ebc923bc29")];
#[crate_type = "lib"];
use std;
export context;
resource arc_destruct<T: const>(_data: int) { }
fn arc<T: const>(_data: T) -> arc_destruct<T> {
arc_destruct(0)
}
fn init() -> arc_destruct<context_res> unsafe {
arc(context_res())
}
class context_res {
let ctx : int;
new() { self.ctx = 0; }
drop { }
}
type context = arc_destruct<context_res>;
impl context for context {
fn socket() { }
}

View file

@ -0,0 +1,8 @@
// xfail-fast
// aux-build:issue-2526.rs
use zmq;
import zmq::*;
fn main() {}