From 232783c9148045e811034985ff7ccbb1520a7a24 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Tue, 28 Jun 2016 23:03:56 +0000 Subject: [PATCH 1/2] Fix infinite loop on recursive module exports in an extern crate --- src/librustc_resolve/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 8ffa95ec7e9..f983646479b 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -3194,7 +3194,9 @@ fn lookup_candidates(&mut self, 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(); - worklist.push((module, path_segments, is_extern)); + if !worklist.iter().any(|&(m, _, _)| m.def == module.def) { + worklist.push((module, path_segments, is_extern)); + } } } }) From 9ffe1c9fba7d1327b1836188f76ca430e0333690 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Wed, 29 Jun 2016 00:18:07 +0000 Subject: [PATCH 2/2] Add regression test --- .../compile-fail/auxiliary/recursive_reexports.rs | 13 +++++++++++++ src/test/compile-fail/recursive-reexports.rs | 15 +++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/test/compile-fail/auxiliary/recursive_reexports.rs create mode 100644 src/test/compile-fail/recursive-reexports.rs diff --git a/src/test/compile-fail/auxiliary/recursive_reexports.rs b/src/test/compile-fail/auxiliary/recursive_reexports.rs new file mode 100644 index 00000000000..1186e3d62f7 --- /dev/null +++ b/src/test/compile-fail/auxiliary/recursive_reexports.rs @@ -0,0 +1,13 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub mod foo { + pub use foo; +} diff --git a/src/test/compile-fail/recursive-reexports.rs b/src/test/compile-fail/recursive-reexports.rs new file mode 100644 index 00000000000..6fd52beeec6 --- /dev/null +++ b/src/test/compile-fail/recursive-reexports.rs @@ -0,0 +1,15 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:recursive_reexports.rs + +fn f() -> recursive_reexports::S {} //~ ERROR undeclared + +fn main() {}