about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTom Lee <github@tomlee.co>2013-05-11 21:46:30 -0700
committerTom Lee <github@tomlee.co>2013-05-19 17:07:18 -0700
commite02716e6d3a65bde24f49207274a74a22790a201 (patch)
tree94c84e8184ab95dd36531b9fc7ce89cd2a8f283b
parentebdb0dee272829f2410edd51acdb12f20721ce42 (diff)
downloadrust-e02716e6d3a65bde24f49207274a74a22790a201.tar.gz
rust-e02716e6d3a65bde24f49207274a74a22790a201.zip
Reexport static trait methods on traits in the same module.
-rw-r--r--src/librustc/metadata/encoder.rs6
-rw-r--r--src/test/auxiliary/mod_trait_with_static_methods_lib.rs10
-rw-r--r--src/test/run-pass/trait_with_static_methods_cross_crate.rs2
3 files changed, 16 insertions, 2 deletions
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs
index 8c21998768e..78adee4b4f2 100644
--- a/src/librustc/metadata/encoder.rs
+++ b/src/librustc/metadata/encoder.rs
@@ -386,8 +386,10 @@ fn encode_reexported_static_methods(ecx: @EncodeContext,
     match ecx.tcx.trait_methods_cache.find(&exp.def_id) {
         Some(methods) => {
             match ecx.tcx.items.find(&exp.def_id.node) {
-                Some(&ast_map::node_item(_, path)) => {
-                    if mod_path != *path {
+                Some(&ast_map::node_item(item, path)) => {
+                    let interner = ecx.tcx.sess.parse_sess.interner;
+                    let original_name = ecx.tcx.sess.str_of(item.ident);
+                    if mod_path != *path || *exp.name != *original_name {
                         for methods.each |&m| {
                             if m.explicit_self == ast::sty_static {
                                 encode_reexported_static_method(ecx,
diff --git a/src/test/auxiliary/mod_trait_with_static_methods_lib.rs b/src/test/auxiliary/mod_trait_with_static_methods_lib.rs
index 2099c6a2f2f..3591ff79318 100644
--- a/src/test/auxiliary/mod_trait_with_static_methods_lib.rs
+++ b/src/test/auxiliary/mod_trait_with_static_methods_lib.rs
@@ -9,6 +9,15 @@
 // except according to those terms.
 
 pub use sub_foo::Foo;
+pub use Baz = self::Bar;
+
+pub trait Bar {
+    pub fn bar() -> Self;
+}
+
+impl Bar for int {
+    pub fn bar() -> int { 84 }
+}
 
 pub mod sub_foo {
     pub trait Foo {
@@ -18,4 +27,5 @@ pub mod sub_foo {
     impl Foo for int {
         pub fn foo() -> int { 42 }
     }
+
 }
diff --git a/src/test/run-pass/trait_with_static_methods_cross_crate.rs b/src/test/run-pass/trait_with_static_methods_cross_crate.rs
index 20dcbf3267b..4402881c43d 100644
--- a/src/test/run-pass/trait_with_static_methods_cross_crate.rs
+++ b/src/test/run-pass/trait_with_static_methods_cross_crate.rs
@@ -13,7 +13,9 @@
 extern mod mod_trait_with_static_methods_lib;
 
 use mod_trait_with_static_methods_lib::Foo;
+use mod_trait_with_static_methods_lib::Baz;
 
 pub fn main() {
     assert_eq!(42, Foo::foo());
+    assert_eq!(84, Baz::bar());
 }