about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-10-22 06:47:27 +0000
committerbors <bors@rust-lang.org>2015-10-22 06:47:27 +0000
commit5eac68cca7bccf2bdd13452d825bd8ffe4ad0be2 (patch)
treea4c3ad501b499f10073d23200bc13f2df78497fa
parent7bb0ac59b18cc6b0f5169feff2f2eafb65c51b1a (diff)
parentad4cdf7077193b8496af5e1ef23188e7589ade24 (diff)
downloadrust-5eac68cca7bccf2bdd13452d825bd8ffe4ad0be2.tar.gz
rust-5eac68cca7bccf2bdd13452d825bd8ffe4ad0be2.zip
Auto merge of #29210 - arielb1:suggest-overflow, r=eddyb
This prevents a stack-overflow when the module graph was cyclic.

Fixes #29181 

r? @eddyb 
-rw-r--r--src/librustc_typeck/check/method/suggest.rs13
-rw-r--r--src/test/auxiliary/issue-29181.rs15
-rw-r--r--src/test/compile-fail/issue-29181.rs17
3 files changed, 43 insertions, 2 deletions
diff --git a/src/librustc_typeck/check/method/suggest.rs b/src/librustc_typeck/check/method/suggest.rs
index e10175c81aa..f597820639c 100644
--- a/src/librustc_typeck/check/method/suggest.rs
+++ b/src/librustc_typeck/check/method/suggest.rs
@@ -23,6 +23,7 @@ use middle::lang_items::FnOnceTraitLangItem;
 use middle::subst::Substs;
 use middle::traits::{Obligation, SelectionContext};
 use metadata::{csearch, cstore, decoder};
+use util::nodemap::{FnvHashSet};
 
 use syntax::ast;
 use syntax::codemap::Span;
@@ -406,7 +407,9 @@ pub fn all_traits<'a>(ccx: &'a CrateCtxt) -> AllTraits<'a> {
         }, ccx.tcx.map.krate());
 
         // Cross-crate:
+        let mut external_mods = FnvHashSet();
         fn handle_external_def(traits: &mut AllTraitsVec,
+                               external_mods: &mut FnvHashSet<DefId>,
                                ccx: &CrateCtxt,
                                cstore: &cstore::CStore,
                                dl: decoder::DefLike) {
@@ -415,8 +418,12 @@ pub fn all_traits<'a>(ccx: &'a CrateCtxt) -> AllTraits<'a> {
                     traits.push(TraitInfo::new(did));
                 }
                 decoder::DlDef(def::DefMod(did)) => {
+                    if !external_mods.insert(did) {
+                        return;
+                    }
                     csearch::each_child_of_item(cstore, did, |dl, _, _| {
-                        handle_external_def(traits, ccx, cstore, dl)
+                        handle_external_def(traits, external_mods,
+                                            ccx, cstore, dl)
                     })
                 }
                 _ => {}
@@ -425,7 +432,9 @@ pub fn all_traits<'a>(ccx: &'a CrateCtxt) -> AllTraits<'a> {
         let cstore = &ccx.tcx.sess.cstore;
         cstore.iter_crate_data(|cnum, _| {
             csearch::each_top_level_item_of_crate(cstore, cnum, |dl, _, _| {
-                handle_external_def(&mut traits, ccx, cstore, dl)
+                handle_external_def(&mut traits,
+                                    &mut external_mods,
+                                    ccx, cstore, dl)
             })
         });
 
diff --git a/src/test/auxiliary/issue-29181.rs b/src/test/auxiliary/issue-29181.rs
new file mode 100644
index 00000000000..361f1ea5509
--- /dev/null
+++ b/src/test/auxiliary/issue-29181.rs
@@ -0,0 +1,15 @@
+// Copyright 2015 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![crate_type="lib"]
+
+pub mod foo {
+    pub use super::*;
+}
diff --git a/src/test/compile-fail/issue-29181.rs b/src/test/compile-fail/issue-29181.rs
new file mode 100644
index 00000000000..2fcec51912e
--- /dev/null
+++ b/src/test/compile-fail/issue-29181.rs
@@ -0,0 +1,17 @@
+// Copyright 2015 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:issue-29181.rs
+
+extern crate issue_29181 as foo;
+
+fn main() {
+    0.homura(); //~ ERROR no method named `homura` found
+}