]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Make entire crates privileged scopes for the purposes of coherence
authorPatrick Walton <pcwalton@mimiga.net>
Fri, 31 Aug 2012 22:10:44 +0000 (15:10 -0700)
committerPatrick Walton <pcwalton@mimiga.net>
Fri, 31 Aug 2012 22:14:15 +0000 (15:14 -0700)
src/rustc/middle/typeck/coherence.rs
src/test/run-pass/coherence-impl-in-fn.rs [new file with mode: 0644]

index 8076da7c971165bc05c1ab8a9be48ed5a015e58e..e8f4c2b5f0de9dd3b827966cb677c6bb421c9983 100644 (file)
@@ -147,18 +147,12 @@ struct CoherenceChecker {
 
     let privileged_implementations: hashmap<node_id,()>;
 
-    // The set of types that we are currently in the privileged scope of. This
-    // is used while we traverse the AST while checking privileged scopes.
-
-    let privileged_types: hashmap<def_id,()>;
-
     new(crate_context: @crate_ctxt) {
         self.crate_context = crate_context;
         self.inference_context = new_infer_ctxt(crate_context.tcx);
 
         self.base_type_def_ids = new_def_hash();
         self.privileged_implementations = int_hash();
-        self.privileged_types = new_def_hash();
     }
 
     // Create a mapping containing a MethodInfo for every provided
@@ -427,36 +421,12 @@ fn get_self_type_for_implementation(implementation: @Impl)
 
     // Privileged scope checking
     fn check_privileged_scopes(crate: @crate) {
-        // Gather up all privileged types.
-        let privileged_types =
-            self.gather_privileged_types(crate.node.module.items);
-        for privileged_types.each |privileged_type| {
-            self.privileged_types.insert(privileged_type, ());
-        }
-
         visit_crate(*crate, (), mk_vt(@{
             visit_item: |item, _context, visitor| {
                 match item.node {
                     item_mod(module_) => {
-                        // First, gather up all privileged types.
-                        let privileged_types =
-                            self.gather_privileged_types(module_.items);
-                        for privileged_types.each |privileged_type| {
-                            debug!("(checking privileged scopes) entering \
-                                    privileged scope of %d:%d",
-                                   privileged_type.crate,
-                                   privileged_type.node);
-
-                            self.privileged_types.insert(privileged_type, ());
-                        }
-
                         // Then visit the module items.
                         visit_mod(module_, item.span, item.id, (), visitor);
-
-                        // Finally, remove privileged types from the map.
-                        for privileged_types.each |privileged_type| {
-                            self.privileged_types.remove(privileged_type);
-                        }
                     }
                     item_impl(_, associated_traits, _, _) => {
                         match self.base_type_def_ids.find(
@@ -467,12 +437,9 @@ fn check_privileged_scopes(crate: @crate) {
                             }
                             Some(base_type_def_id) => {
                                 // Check to see whether the implementation is
-                                // in the scope of its base type.
-
-                                let privileged_types = &self.privileged_types;
-                                if privileged_types.
-                                        contains_key(base_type_def_id) {
+                                // in the same crate as its base type.
 
+                                if base_type_def_id.crate == local_crate {
                                     // Record that this implementation is OK.
                                     self.privileged_implementations.insert
                                         (item.id, ());
@@ -492,7 +459,7 @@ fn check_privileged_scopes(crate: @crate) {
                                                          ~"cannot implement \
                                                           inherent methods \
                                                           for a type outside \
-                                                          the scope the type \
+                                                          the crate the type \
                                                           was defined in; \
                                                           define and \
                                                           implement a trait \
@@ -546,25 +513,6 @@ fn trait_ref_to_trait_def_id(trait_ref: @trait_ref) -> def_id {
         return trait_id;
     }
 
-    fn gather_privileged_types(items: ~[@item]) -> @DVec<def_id> {
-        let results = @DVec();
-        for items.each |item| {
-            match item.node {
-                item_class(*) | item_enum(*) | item_trait(*) => {
-                    results.push(local_def(item.id));
-                }
-
-                item_const(*) | item_fn(*) | item_mod(*) |
-                item_foreign_mod(*) | item_ty(*) | item_impl(*) |
-                item_mac(*) => {
-                    // Nothing to do.
-                }
-            }
-        }
-
-        return results;
-    }
-
     // Converts an implementation in the AST to an Impl structure.
     fn create_impl_from_item(item: @item) -> @Impl {
 
diff --git a/src/test/run-pass/coherence-impl-in-fn.rs b/src/test/run-pass/coherence-impl-in-fn.rs
new file mode 100644 (file)
index 0000000..fb8b37c
--- /dev/null
@@ -0,0 +1,6 @@
+fn main() {
+    enum x { foo }
+    impl x : core::cmp::Eq {
+        pure fn eq(&&other: x) -> bool { self as int == other as int }
+    }
+}