diff options
| author | bors <bors@rust-lang.org> | 2015-10-22 06:47:27 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-10-22 06:47:27 +0000 |
| commit | 5eac68cca7bccf2bdd13452d825bd8ffe4ad0be2 (patch) | |
| tree | a4c3ad501b499f10073d23200bc13f2df78497fa | |
| parent | 7bb0ac59b18cc6b0f5169feff2f2eafb65c51b1a (diff) | |
| parent | ad4cdf7077193b8496af5e1ef23188e7589ade24 (diff) | |
| download | rust-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.rs | 13 | ||||
| -rw-r--r-- | src/test/auxiliary/issue-29181.rs | 15 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-29181.rs | 17 |
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 +} |
