Auto merge of #29210 - arielb1:suggest-overflow, r=eddyb
This prevents a stack-overflow when the module graph was cyclic. Fixes #29181 r? @eddyb
This commit is contained in:
commit
5eac68cca7
@ -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)
|
||||
})
|
||||
});
|
||||
|
||||
|
15
src/test/auxiliary/issue-29181.rs
Normal file
15
src/test/auxiliary/issue-29181.rs
Normal file
@ -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::*;
|
||||
}
|
17
src/test/compile-fail/issue-29181.rs
Normal file
17
src/test/compile-fail/issue-29181.rs
Normal file
@ -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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user