Skip to content
This repository
Browse code

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
  • Loading branch information...
commit a70e37b214407743ba9ac7e688e13d7a9d644ad5 1 parent a19dce6
Tim Chevalier authored August 28, 2012
19  src/rustc/middle/ty.rs
@@ -2826,22 +2826,11 @@ fn impl_traits(cx: ctxt, id: ast::def_id) -> ~[t] {
2826 2826
                     node_id_to_type(cx, trait_ref.ref_id)
2827 2827
                 }
2828 2828
            }
2829  
-           Some(ast_map::node_item(@{node: ast::item_class(*),
  2829
+           Some(ast_map::node_item(@{node: ast::item_class(sd,_),
2830 2830
                            _},_)) => {
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
+                }
2845 2834
            }
2846 2835
            _ => ~[]
2847 2836
         }
20  src/test/run-pass/issue-2936.rs
... ...
@@ -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 notes on commit a70e37b

Please sign in to comment.
Something went wrong with that request. Please try again.