Skip to content

Commit 5e9f269

Browse files
committed
---
yaml --- r: 12158 b: refs/heads/master c: 90cf9e0 h: refs/heads/master v: v3
1 parent b949419 commit 5e9f269

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: d3b6fe0a914c72bd5a3b190f32f0c5c5973d2c73
2+
refs/heads/master: 90cf9e0d6ff9c7788939ee100db6de9faeff3734
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/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)