Skip to content

Commit 90cf9e0

Browse files
committed
Make sure type_use.rs doesn't get lost in recursive enums
Closes #2059
1 parent d3b6fe0 commit 90cf9e0

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

src/rustc/middle/trans/type_use.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
// invasive.)
1919

2020
import std::map::hashmap;
21+
import std::list;
2122
import driver::session::session;
2223
import metadata::csearch;
2324
import syntax::ast::*, syntax::ast_util, syntax::visit;
@@ -91,21 +92,25 @@ fn type_needs(cx: ctx, use: uint, ty: ty::t) {
9192
let mut done = true;
9293
// Optimization -- don't descend type if all params already have this use
9394
for vec::each(cx.uses) {|u| if u & use != use { done = false } }
94-
if !done { type_needs_inner(cx, use, ty); }
95+
if !done { type_needs_inner(cx, use, ty, list::nil); }
9596
}
9697

97-
fn type_needs_inner(cx: ctx, use: uint, ty: ty::t) {
98+
fn type_needs_inner(cx: ctx, use: uint, ty: ty::t,
99+
enums_seen: list::list<def_id>) {
98100
ty::maybe_walk_ty(ty) {|ty|
99101
if ty::type_has_params(ty) {
100102
alt ty::get(ty).struct {
101103
ty::ty_fn(_) | ty::ty_ptr(_) | ty::ty_rptr(_, _) |
102104
ty::ty_box(_) | ty::ty_iface(_, _) { false }
103105
ty::ty_enum(did, tps) {
104-
for vec::each(*ty::enum_variants(cx.ccx.tcx, did)) {|v|
105-
for vec::each(v.args) {|aty|
106-
let t = ty::substitute_type_params(cx.ccx.tcx, tps,
107-
aty);
108-
type_needs_inner(cx, use, t);
106+
if option::is_none(list::find(enums_seen, {|id| id == did})) {
107+
let seen = list::cons(did, @enums_seen);
108+
for vec::each(*ty::enum_variants(cx.ccx.tcx, did)) {|v|
109+
for vec::each(v.args) {|aty|
110+
let t = ty::substitute_type_params(cx.ccx.tcx,
111+
tps, aty);
112+
type_needs_inner(cx, use, t, seen);
113+
}
109114
}
110115
}
111116
false

0 commit comments

Comments
 (0)