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, 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 or the MIT license +// , 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 or the MIT license +// , 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 +}