about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-12-22 08:27:26 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-12-22 08:58:10 +0000
commit098c9b69e113c1894fad39acbadd63a3aaca458c (patch)
treefe8ef511beff75af49007f04a7c7e3f815da751f
parentc217ab6c8dc1a305304b00a414be5f39ea6a2c81 (diff)
downloadrust-098c9b69e113c1894fad39acbadd63a3aaca458c.tar.gz
rust-098c9b69e113c1894fad39acbadd63a3aaca458c.zip
Fix non-termination in `resolve`.
-rw-r--r--src/librustc_resolve/lib.rs3
-rw-r--r--src/test/compile-fail/recursive-reexports.rs4
2 files changed, 5 insertions, 2 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index f73227681c5..091dc9fd4bc 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -2943,6 +2943,7 @@ impl<'a> Resolver<'a> {
 
         let mut lookup_results = Vec::new();
         let mut worklist = Vec::new();
+        let mut seen_modules = FxHashSet();
         worklist.push((self.graph_root, Vec::new(), false));
 
         while let Some((in_module,
@@ -2989,7 +2990,7 @@ impl<'a> Resolver<'a> {
                     if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
                         // add the module to the lookup
                         let is_extern = in_module_is_extern || name_binding.is_extern_crate();
-                        if !worklist.iter().any(|&(m, ..)| m.def() == module.def()) {
+                        if seen_modules.insert(module.def_id().unwrap()) {
                             worklist.push((module, path_segments, is_extern));
                         }
                     }
diff --git a/src/test/compile-fail/recursive-reexports.rs b/src/test/compile-fail/recursive-reexports.rs
index 6fd52beeec6..aa444d45eeb 100644
--- a/src/test/compile-fail/recursive-reexports.rs
+++ b/src/test/compile-fail/recursive-reexports.rs
@@ -10,6 +10,8 @@
 
 // aux-build:recursive_reexports.rs
 
-fn f() -> recursive_reexports::S {} //~ ERROR undeclared
+extern crate recursive_reexports;
+
+fn f() -> recursive_reexports::S {} //~ ERROR type name `recursive_reexports::S` is undefined
 
 fn main() {}