about summary refs log tree commit diff
path: root/src/librustc/traits
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-10-08 16:03:38 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-10-15 13:55:43 -0700
commit99ab45b91de9fc6c07903dbe3075757f0e5e9071 (patch)
tree6ff2df433369aa7e61246955db6864a26186950f /src/librustc/traits
parentdbd75c8c40a06ac682251b67a548a8252c5d4b18 (diff)
downloadrust-99ab45b91de9fc6c07903dbe3075757f0e5e9071.tar.gz
rust-99ab45b91de9fc6c07903dbe3075757f0e5e9071.zip
Handle `Self` restriction needed
Diffstat (limited to 'src/librustc/traits')
-rw-r--r--src/librustc/traits/error_reporting.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs
index c8baafef50a..6e111089d06 100644
--- a/src/librustc/traits/error_reporting.rs
+++ b/src/librustc/traits/error_reporting.rs
@@ -986,6 +986,34 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
         while let Some(node) = self.tcx.hir().find(hir_id) {
             debug!("suggest_restricting_param_bound node={:?}", node);
             match node {
+                hir::Node::Item(hir::Item {
+                    kind: hir::ItemKind::Fn(decl, _, generics, _), ..
+                }) |
+                hir::Node::TraitItem(hir::TraitItem {
+                    generics,
+                    kind: hir::TraitItemKind::Method(hir::MethodSig { decl, .. }, _), ..
+                }) |
+                hir::Node::ImplItem(hir::ImplItem {
+                    generics,
+                    kind: hir::ImplItemKind::Method(hir::MethodSig { decl, .. }, _), ..
+                }) if param_ty.name.as_str() == "Self" => {
+                    if !generics.where_clause.predicates.is_empty() {
+                        err.span_suggestion(
+                            generics.where_clause.span().unwrap().shrink_to_hi(),
+                            "consider further restricting `Self`",
+                            format!(", {}", trait_ref.to_predicate()),
+                            Applicability::MachineApplicable,
+                        );
+                    } else {
+                        err.span_suggestion(
+                            decl.output.span().shrink_to_hi(),
+                            "consider further restricting `Self`",
+                            format!(" where {}", trait_ref.to_predicate()),
+                            Applicability::MachineApplicable,
+                        );
+                    }
+                    return;
+                }
                 hir::Node::Item(hir::Item { kind: hir::ItemKind::Struct(_, generics), span, .. }) |
                 hir::Node::Item(hir::Item { kind: hir::ItemKind::Enum(_, generics), span, .. }) |
                 hir::Node::Item(hir::Item { kind: hir::ItemKind::Union(_, generics), span, .. }) |