about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2016-01-03 00:11:48 +0100
committerFlorian Hahn <flo@fhahn.com>2016-01-03 00:11:48 +0100
commita8d60708ecabc90ca4b72e12483159339a0b40ce (patch)
treec24b5c03dc1977e3c3267f3ad91dafa3ba45def9
parent25e4389866d8a4483d7a20b5d3a72c2b00dd9c21 (diff)
downloadrust-a8d60708ecabc90ca4b72e12483159339a0b40ce.tar.gz
rust-a8d60708ecabc90ca4b72e12483159339a0b40ce.zip
Refactor candidate selection
-rw-r--r--src/librustc/middle/traits/error_reporting.rs23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/librustc/middle/traits/error_reporting.rs b/src/librustc/middle/traits/error_reporting.rs
index adf0fdee182..038c414662a 100644
--- a/src/librustc/middle/traits/error_reporting.rs
+++ b/src/librustc/middle/traits/error_reporting.rs
@@ -240,23 +240,24 @@ pub fn report_selection_error<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>,
                                 let mut impl_candidates = Vec::new();
                                 let trait_def = infcx.tcx.lookup_trait_def(trait_ref.def_id());
 
-                                trait_def.for_each_impl(infcx.tcx, |def_id| {
-                                    let imp = infcx.tcx.impl_trait_ref(def_id).unwrap();
-                                    if let Some(simp) = simp {
+                                match simp {
+                                    Some(simp) => trait_def.for_each_impl(infcx.tcx, |def_id| {
+                                        let imp = infcx.tcx.impl_trait_ref(def_id).unwrap();
                                         let imp_simp = fast_reject::simplify_type(infcx.tcx,
                                                                                   imp.self_ty(),
                                                                                   true);
                                         if let Some(imp_simp) = imp_simp {
-                                            if simp == imp_simp {
-                                                impl_candidates.push(imp);
+                                            if simp != imp_simp {
+                                                return;
                                             }
-                                        } else {
-                                            impl_candidates.push(imp);
                                         }
-                                    } else {
                                         impl_candidates.push(imp);
-                                    }
-                                });
+                                    }),
+                                    None => trait_def.for_each_impl(infcx.tcx, |def_id| {
+                                        impl_candidates.push(
+                                            infcx.tcx.impl_trait_ref(def_id).unwrap());
+                                    })
+                                };
 
                                 if impl_candidates.len() > 0 {
                                     err.fileline_help(
@@ -266,7 +267,7 @@ pub fn report_selection_error<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>,
                                     let end = cmp::min(4, impl_candidates.len());
                                     for candidate in &impl_candidates[0..end] {
                                         err.fileline_help(obligation.cause.span,
-                                                                     candidate);
+                                                          &format!("  {:?}", candidate));
                                     }
                                     if impl_candidates.len() > 4 {
                                         err.fileline_help(obligation.cause.span,