diff options
| author | Florian Hahn <flo@fhahn.com> | 2015-12-28 23:50:18 +0100 |
|---|---|---|
| committer | Florian Hahn <flo@fhahn.com> | 2016-01-02 19:47:41 +0100 |
| commit | 25e4389866d8a4483d7a20b5d3a72c2b00dd9c21 (patch) | |
| tree | 27b47e3b48ff1ea085580bc773b8531f3f94b8fe | |
| parent | ba24fbd404d7489298af68b4384d1544cd54844d (diff) | |
| download | rust-25e4389866d8a4483d7a20b5d3a72c2b00dd9c21.tar.gz rust-25e4389866d8a4483d7a20b5d3a72c2b00dd9c21.zip | |
Use for_each_impl
| -rw-r--r-- | src/librustc/middle/traits/error_reporting.rs | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/src/librustc/middle/traits/error_reporting.rs b/src/librustc/middle/traits/error_reporting.rs index f4235f3df21..adf0fdee182 100644 --- a/src/librustc/middle/traits/error_reporting.rs +++ b/src/librustc/middle/traits/error_reporting.rs @@ -234,39 +234,30 @@ pub fn report_selection_error<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>, if let Some(s) = custom_note { err.fileline_note(obligation.cause.span, &s); } else { - infcx.tcx.populate_implementations_for_trait_if_necessary( - trait_ref.def_id()); - + let simp = fast_reject::simplify_type(infcx.tcx, + trait_ref.self_ty(), + true); + let mut impl_candidates = Vec::new(); let trait_def = infcx.tcx.lookup_trait_def(trait_ref.def_id()); - let blanket_impls = trait_def.blanket_impls.borrow(); - let impl_iter = blanket_impls.iter() - .filter_map(|&id| - infcx.tcx.impl_trait_ref(id)); - - let nonblanket = trait_def.nonblanket_impls.borrow(); - let nonblanket_iter = nonblanket.values() - .flat_map(|ids| - ids.iter().filter_map(|&id| - infcx.tcx.impl_trait_ref(id))); - - let simp = fast_reject::simplify_type(infcx.tcx, trait_ref.self_ty(), true); - let nonblanket_iter = nonblanket_iter.filter(|def| { + + trait_def.for_each_impl(infcx.tcx, |def_id| { + let imp = infcx.tcx.impl_trait_ref(def_id).unwrap(); if let Some(simp) = simp { - let imp_simp = fast_reject::simplify_type(infcx.tcx, def.self_ty(), true); + let imp_simp = fast_reject::simplify_type(infcx.tcx, + imp.self_ty(), + true); if let Some(imp_simp) = imp_simp { - simp == imp_simp + if simp == imp_simp { + impl_candidates.push(imp); + } } else { - false + impl_candidates.push(imp); } } else { - true + impl_candidates.push(imp); } }); - let impl_candidates = impl_iter.chain(nonblanket_iter) - .map(|imp| format!(" {}", imp)) - .take(5).collect::<Vec<_>>(); - if impl_candidates.len() > 0 { err.fileline_help( obligation.cause.span, |
