]> git.lizzy.rs Git - rust.git/commitdiff
Block import resolution only on 'pub' imports.
authorVictor Berger <victor.berger@m4x.org>
Wed, 5 Aug 2015 19:47:01 +0000 (21:47 +0200)
committerVictor Berger <victor.berger@m4x.org>
Wed, 5 Aug 2015 19:57:27 +0000 (21:57 +0200)
When resolving 'use' statements, only consider pub imports of the
target module as blocking.

Closes #4865

src/librustc_resolve/build_reduced_graph.rs
src/librustc_resolve/lib.rs
src/librustc_resolve/resolve_imports.rs

index 656d6a36614706d3d2eb4375b21be2cb6723398d..355578ddccf2a4c862599cc0f32a09426e57163b 100644 (file)
@@ -926,6 +926,11 @@ fn build_import_directive(&mut self,
                                                                is_public,
                                                                shadowable));
         self.unresolved_imports += 1;
+
+        if is_public {
+            module_.pub_count.set(module_.pub_count.get() + 1);
+        }
+
         // Bump the reference count on the name. Or, if this is a glob, set
         // the appropriate flag.
 
@@ -959,6 +964,9 @@ fn build_import_directive(&mut self,
                 // module's exports ahead of time.
 
                 module_.glob_count.set(module_.glob_count.get() + 1);
+                if is_public {
+                    module_.pub_glob_count.set(module_.pub_glob_count.get() + 1);
+                }
             }
         }
     }
index 8c2bb9a88025f17c90030f1de1cbc3ab0991622c..1dd26fe7c58afb0f09d42d8652756b727174c4d1 100644 (file)
@@ -699,6 +699,12 @@ pub struct Module {
     // The number of unresolved globs that this module exports.
     glob_count: Cell<usize>,
 
+    // The number of unresolved pub imports (both regular and globs) in this module
+    pub_count: Cell<usize>,
+
+    // The number of unresolved pub glob imports in this module
+    pub_glob_count: Cell<usize>,
+
     // The index of the import we're resolving.
     resolved_import_count: Cell<usize>,
 
@@ -726,6 +732,8 @@ fn new(parent_link: ParentLink,
             anonymous_children: RefCell::new(NodeMap()),
             import_resolutions: RefCell::new(HashMap::new()),
             glob_count: Cell::new(0),
+            pub_count: Cell::new(0),
+            pub_glob_count: Cell::new(0),
             resolved_import_count: Cell::new(0),
             populated: Cell::new(!external),
         }
index 412643ba9454642ae422eee7865fcffcdb9695c3..18fefa967ea3a579f43a6edebea390007076743c 100644 (file)
@@ -409,11 +409,19 @@ fn resolve_import_for_module(&mut self,
                 GlobImport => {
                     assert!(module_.glob_count.get() >= 1);
                     module_.glob_count.set(module_.glob_count.get() - 1);
+                    if import_directive.is_public {
+                        assert!(module_.pub_glob_count.get() >= 1);
+                        module_.pub_glob_count.set(module_.pub_glob_count.get() - 1);
+                    }
                 }
                 SingleImport(..) => {
                     // Ignore.
                 }
             }
+            if import_directive.is_public {
+                assert!(module_.pub_count.get() >= 1);
+                module_.pub_count.set(module_.pub_count.get() - 1);
+            }
         }
 
         return resolution_result;
@@ -503,8 +511,8 @@ fn resolve_single_import(&mut self,
                 // containing module, bail out. We don't know enough to be
                 // able to resolve this import.
 
-                if target_module.glob_count.get() > 0 {
-                    debug!("(resolving single import) unresolved glob; \
+                if target_module.pub_glob_count.get() > 0 {
+                    debug!("(resolving single import) unresolved pub glob; \
                             bailing out");
                     return ResolveResult::Indeterminate;
                 }
@@ -767,16 +775,22 @@ fn resolve_glob_import(&mut self,
 
         // We must bail out if the node has unresolved imports of any kind
         // (including globs).
-        if !(*target_module).all_imports_resolved() {
+        if (*target_module).pub_count.get() > 0 {
             debug!("(resolving glob import) target module has unresolved \
-                    imports; bailing out");
+                    pub imports; bailing out");
             return ResolveResult::Indeterminate;
         }
 
-        assert_eq!(target_module.glob_count.get(), 0);
-
         // Add all resolved imports from the containing module.
         let import_resolutions = target_module.import_resolutions.borrow();
+
+        if module_.import_resolutions.borrow_state() != ::std::cell::BorrowState::Unused {
+            // In this case, target_module == module_
+            // This means we are trying to glob import a module into itself,
+            // and it is a no-go
+            return ResolveResult::Indeterminate;
+        }
+
         for (ident, target_import_resolution) in import_resolutions.iter() {
             debug!("(resolving glob import) writing module resolution \
                     {} into `{}`",