From 04eb9b4eb0472aa89dce1ad53d33f5e52284b128 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 31 Jan 2013 12:40:05 -0800 Subject: [PATCH] librustc: Fix bugs regarding to impl privacy. rs=bugfix --- src/librustc/metadata/encoder.rs | 4 ++-- src/librustc/middle/resolve.rs | 2 +- src/test/auxiliary/impl_privacy_xc_1.rs | 10 ++++++++++ src/test/auxiliary/impl_privacy_xc_2.rs | 15 +++++++++++++++ src/test/run-pass/impl-privacy-xc-1.rs | 9 +++++++++ src/test/run-pass/impl-privacy-xc-2.rs | 10 ++++++++++ 6 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 src/test/auxiliary/impl_privacy_xc_1.rs create mode 100644 src/test/auxiliary/impl_privacy_xc_2.rs create mode 100644 src/test/run-pass/impl-privacy-xc-1.rs create mode 100644 src/test/run-pass/impl-privacy-xc-2.rs diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index b8a1b942453..c6be09725e4 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -547,8 +547,8 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, let tcx = ecx.tcx; let must_write = match item.node { - item_enum(_, _) | item_impl(*) - | item_trait(*) | item_struct(*) => true, + item_enum(_, _) | item_impl(*) | item_trait(*) | item_struct(*) | + item_mod(*) | item_foreign_mod(*) => true, _ => false }; if !must_write && !reachable(ecx, item.id) { return; } diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index c47baa8f7a4..09886913bc5 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -1212,7 +1212,7 @@ pub impl Resolver { let parent_link = self.get_parent_link(new_parent, ident); let def_id = local_def(item.id); - name_bindings.define_module(privacy, + name_bindings.define_module(Public, parent_link, Some(def_id), TraitModuleKind, diff --git a/src/test/auxiliary/impl_privacy_xc_1.rs b/src/test/auxiliary/impl_privacy_xc_1.rs new file mode 100644 index 00000000000..05d5cee47f2 --- /dev/null +++ b/src/test/auxiliary/impl_privacy_xc_1.rs @@ -0,0 +1,10 @@ +#[crate_type = "lib"]; + +pub struct Fish { + x: int +} + +impl Fish { + fn swim(&self) {} +} + diff --git a/src/test/auxiliary/impl_privacy_xc_2.rs b/src/test/auxiliary/impl_privacy_xc_2.rs new file mode 100644 index 00000000000..009e132f598 --- /dev/null +++ b/src/test/auxiliary/impl_privacy_xc_2.rs @@ -0,0 +1,15 @@ +#[crate_type = "lib"]; + +pub struct Fish { + x: int +} + +mod unexported { + use super::Fish; + impl Fish : Eq { + pure fn eq(&self, _: &Fish) -> bool { true } + pure fn ne(&self, _: &Fish) -> bool { false } + } +} + + diff --git a/src/test/run-pass/impl-privacy-xc-1.rs b/src/test/run-pass/impl-privacy-xc-1.rs new file mode 100644 index 00000000000..0fbb88e2ff8 --- /dev/null +++ b/src/test/run-pass/impl-privacy-xc-1.rs @@ -0,0 +1,9 @@ +// aux-build:impl_privacy_xc_1.rs + +extern mod impl_privacy_xc_1; + +fn main() { + let fish = impl_privacy_xc_1::Fish { x: 1 }; + fish.swim(); +} + diff --git a/src/test/run-pass/impl-privacy-xc-2.rs b/src/test/run-pass/impl-privacy-xc-2.rs new file mode 100644 index 00000000000..ab0612ab82d --- /dev/null +++ b/src/test/run-pass/impl-privacy-xc-2.rs @@ -0,0 +1,10 @@ +// aux-build:impl_privacy_xc_2.rs + +extern mod impl_privacy_xc_2; + +fn main() { + let fish1 = impl_privacy_xc_2::Fish { x: 1 }; + let fish2 = impl_privacy_xc_2::Fish { x: 2 }; + io::println(if fish1.eq(&fish2) { "yes" } else { "no " }); +} +