diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-12-22 08:27:26 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-12-22 08:58:10 +0000 |
| commit | 098c9b69e113c1894fad39acbadd63a3aaca458c (patch) | |
| tree | fe8ef511beff75af49007f04a7c7e3f815da751f | |
| parent | c217ab6c8dc1a305304b00a414be5f39ea6a2c81 (diff) | |
| download | rust-098c9b69e113c1894fad39acbadd63a3aaca458c.tar.gz rust-098c9b69e113c1894fad39acbadd63a3aaca458c.zip | |
Fix non-termination in `resolve`.
| -rw-r--r-- | src/librustc_resolve/lib.rs | 3 | ||||
| -rw-r--r-- | src/test/compile-fail/recursive-reexports.rs | 4 |
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() {} |
