about summary refs log tree commit diff
path: root/compiler/rustc_trait_selection/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2020-10-19 17:57:18 -0700
committerEsteban Küber <esteban@kuber.com.ar>2020-10-20 09:26:15 -0700
commit88f5e110db438d6e69a4493e21bd5a99cefdb46d (patch)
treefbf57bd48525a84901062c3062c2e254849cbe0a /compiler/rustc_trait_selection/src
parentae0e3d051178193aec39cb7ea8110301339b3e44 (diff)
downloadrust-88f5e110db438d6e69a4493e21bd5a99cefdb46d.tar.gz
rust-88f5e110db438d6e69a4493e21bd5a99cefdb46d.zip
review comments
Diffstat (limited to 'compiler/rustc_trait_selection/src')
-rw-r--r--compiler/rustc_trait_selection/src/traits/object_safety.rs91
1 files changed, 46 insertions, 45 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/object_safety.rs b/compiler/rustc_trait_selection/src/traits/object_safety.rs
index a170d963c5c..d1647e686a8 100644
--- a/compiler/rustc_trait_selection/src/traits/object_safety.rs
+++ b/compiler/rustc_trait_selection/src/traits/object_safety.rs
@@ -100,51 +100,7 @@ fn object_safety_violations_for_trait(
                 span,
             ) = violation
             {
-                // Using `CRATE_NODE_ID` is wrong, but it's hard to get a more precise id.
-                // It's also hard to get a use site span, so we use the method definition span.
-                tcx.struct_span_lint_hir(
-                    WHERE_CLAUSES_OBJECT_SAFETY,
-                    hir::CRATE_HIR_ID,
-                    *span,
-                    |lint| {
-                        let mut err = lint.build(&format!(
-                            "the trait `{}` cannot be made into an object",
-                            tcx.def_path_str(trait_def_id)
-                        ));
-                        let node = tcx.hir().get_if_local(trait_def_id);
-                        let mut spans = MultiSpan::from_span(*span);
-                        if let Some(hir::Node::Item(item)) = node {
-                            spans.push_span_label(
-                                item.ident.span,
-                                "this trait cannot be made into an object...".into(),
-                            );
-                            spans.push_span_label(
-                                *span,
-                                format!("...because {}", violation.error_msg()),
-                            );
-                        } else {
-                            spans.push_span_label(
-                                *span,
-                                format!(
-                                    "the trait cannot be made into an object because {}",
-                                    violation.error_msg()
-                                ),
-                            );
-                        };
-                        err.span_note(
-                            spans,
-                            "for a trait to be \"object safe\" it needs to allow building a vtable \
-                             to allow the call to be resolvable dynamically; for more information \
-                             visit <https://doc.rust-lang.org/reference/items/traits.html\
-                             #object-safety>",
-                        );
-                        if node.is_some() {
-                            // Only provide the help if its a local trait, otherwise it's not
-                            violation.solution(&mut err);
-                        }
-                        err.emit();
-                    },
-                );
+                lint_object_unsafe_trait(tcx, *span, trait_def_id, violation);
                 false
             } else {
                 true
@@ -182,6 +138,51 @@ fn object_safety_violations_for_trait(
     violations
 }
 
+/// Lint object-unsafe trait.
+fn lint_object_unsafe_trait(
+    tcx: TyCtxt<'_>,
+    span: Span,
+    trait_def_id: DefId,
+    violation: &ObjectSafetyViolation,
+) {
+    // Using `CRATE_NODE_ID` is wrong, but it's hard to get a more precise id.
+    // It's also hard to get a use site span, so we use the method definition span.
+    tcx.struct_span_lint_hir(WHERE_CLAUSES_OBJECT_SAFETY, hir::CRATE_HIR_ID, span, |lint| {
+        let mut err = lint.build(&format!(
+            "the trait `{}` cannot be made into an object",
+            tcx.def_path_str(trait_def_id)
+        ));
+        let node = tcx.hir().get_if_local(trait_def_id);
+        let mut spans = MultiSpan::from_span(span);
+        if let Some(hir::Node::Item(item)) = node {
+            spans.push_span_label(
+                item.ident.span,
+                "this trait cannot be made into an object...".into(),
+            );
+            spans.push_span_label(span, format!("...because {}", violation.error_msg()));
+        } else {
+            spans.push_span_label(
+                span,
+                format!(
+                    "the trait cannot be made into an object because {}",
+                    violation.error_msg()
+                ),
+            );
+        };
+        err.span_note(
+            spans,
+            "for a trait to be \"object safe\" it needs to allow building a vtable to allow the \
+             call to be resolvable dynamically; for more information visit \
+             <https://doc.rust-lang.org/reference/items/traits.html#object-safety>",
+        );
+        if node.is_some() {
+            // Only provide the help if its a local trait, otherwise it's not
+            violation.solution(&mut err);
+        }
+        err.emit();
+    });
+}
+
 fn sized_trait_bound_spans<'tcx>(
     tcx: TyCtxt<'tcx>,
     bounds: hir::GenericBounds<'tcx>,