Skip to content

Commit a70e37b

Browse files
committed
In ty::impl_traits, treat structs properly
Treat structs just like impls: use their associated list of trait refs to get the list of traits that one of them implements. I don't understand what was happening before, but it was wrong. Closes #2936
1 parent a19dce6 commit a70e37b

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

src/rustc/middle/ty.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2826,22 +2826,11 @@ fn impl_traits(cx: ctxt, id: ast::def_id) -> ~[t] {
28262826
node_id_to_type(cx, trait_ref.ref_id)
28272827
}
28282828
}
2829-
Some(ast_map::node_item(@{node: ast::item_class(*),
2829+
Some(ast_map::node_item(@{node: ast::item_class(sd,_),
28302830
_},_)) => {
2831-
match cx.def_map.find(id.node) {
2832-
Some(def_ty(trait_id)) => {
2833-
// XXX: Doesn't work cross-crate.
2834-
debug!("(impl_traits) found trait id %?", trait_id);
2835-
~[node_id_to_type(cx, trait_id.node)]
2836-
}
2837-
Some(x) => {
2838-
cx.sess.bug(fmt!("impl_traits: trait ref is in trait map \
2839-
but is bound to %?", x));
2840-
}
2841-
None => {
2842-
~[]
2843-
}
2844-
}
2831+
do vec::map(sd.traits) |trait_ref| {
2832+
node_id_to_type(cx, trait_ref.ref_id)
2833+
}
28452834
}
28462835
_ => ~[]
28472836
}

src/test/run-pass/issue-2936.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
trait bar<T> {
2+
fn get_bar() -> T;
3+
}
4+
5+
fn foo<T, U: bar<T>>(b: U) -> T {
6+
b.get_bar()
7+
}
8+
9+
struct cbar : bar<int> {
10+
x: int;
11+
new(x: int) { self.x = x; }
12+
fn get_bar() -> int {
13+
self.x
14+
}
15+
}
16+
17+
fn main() {
18+
let x: int = foo::<int, cbar>(cbar(5));
19+
assert x == 5;
20+
}

0 commit comments

Comments
 (0)