about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-03-29 21:21:41 -0400
committerMichael Goulet <michael@errs.io>2024-03-29 21:21:52 -0400
commitbc1f1ef2c82c5c84e0d90c5c5d261444fba9ffec (patch)
tree3194ebae507d093d7313664b89f93e1e4ba2d311
parent5e2c54977202a0a245dca4bfd5171ced47bed487 (diff)
downloadrust-bc1f1ef2c82c5c84e0d90c5c5d261444fba9ffec.tar.gz
rust-bc1f1ef2c82c5c84e0d90c5c5d261444fba9ffec.zip
Stop removing substs from Adt type in coherence
-rw-r--r--compiler/rustc_hir_analysis/messages.ftl2
-rw-r--r--compiler/rustc_hir_analysis/src/coherence/orphan.rs28
-rw-r--r--compiler/rustc_hir_analysis/src/errors.rs15
3 files changed, 32 insertions, 13 deletions
diff --git a/compiler/rustc_hir_analysis/messages.ftl b/compiler/rustc_hir_analysis/messages.ftl
index 9bf4d63267a..d8a90d62dac 100644
--- a/compiler/rustc_hir_analysis/messages.ftl
+++ b/compiler/rustc_hir_analysis/messages.ftl
@@ -295,6 +295,8 @@ hir_analysis_not_supported_delegation =
     {$descr} is not supported yet
     .label = callee defined here
 
+hir_analysis_only_current_traits_adt = `{$name}` is not defined in the current crate
+
 hir_analysis_only_current_traits_arbitrary = only traits defined in the current crate can be implemented for arbitrary types
 
 hir_analysis_only_current_traits_foreign = this is not defined in the current crate because this is a foreign trait
diff --git a/compiler/rustc_hir_analysis/src/coherence/orphan.rs b/compiler/rustc_hir_analysis/src/coherence/orphan.rs
index ca8a635ab5e..92e8c459509 100644
--- a/compiler/rustc_hir_analysis/src/coherence/orphan.rs
+++ b/compiler/rustc_hir_analysis/src/coherence/orphan.rs
@@ -4,7 +4,7 @@
 use crate::errors;
 use rustc_errors::ErrorGuaranteed;
 use rustc_hir as hir;
-use rustc_middle::ty::{self, AliasKind, Ty, TyCtxt, TypeVisitableExt};
+use rustc_middle::ty::{self, AliasKind, TyCtxt, TypeVisitableExt};
 use rustc_span::def_id::LocalDefId;
 use rustc_span::Span;
 use rustc_trait_selection::traits::{self, IsFirstInputType};
@@ -283,8 +283,14 @@ fn emit_orphan_check_error<'tcx>(
     let self_ty = trait_ref.self_ty();
     Err(match err {
         traits::OrphanCheckErr::NonLocalInputType(tys) => {
-            let (mut opaque, mut foreign, mut name, mut pointer, mut ty_diag) =
-                (Vec::new(), Vec::new(), Vec::new(), Vec::new(), Vec::new());
+            // FIXME: Someone needs to just turn these into `Subdiag`s and attach
+            // them to the `Diag` after creating the error.
+            let mut opaque = vec![];
+            let mut foreign = vec![];
+            let mut name = vec![];
+            let mut pointer = vec![];
+            let mut ty_diag = vec![];
+            let mut adt = vec![];
             let mut sugg = None;
             for &(mut ty, is_target_ty) in &tys {
                 let span = if matches!(is_target_ty, IsFirstInputType::Yes) {
@@ -296,15 +302,6 @@ fn emit_orphan_check_error<'tcx>(
                 };
 
                 ty = tcx.erase_regions(ty);
-                ty = match ty.kind() {
-                    // Remove the type arguments from the output, as they are not relevant.
-                    // You can think of this as the reverse of `resolve_vars_if_possible`.
-                    // That way if we had `Vec<MyType>`, we will properly attribute the
-                    // problem to `Vec<T>` and avoid confusing the user if they were to see
-                    // `MyType` in the error.
-                    ty::Adt(def, _) => Ty::new_adt(tcx, *def, ty::List::empty()),
-                    _ => ty,
-                };
 
                 fn push_to_foreign_or_name<'tcx>(
                     is_foreign: bool,
@@ -366,6 +363,10 @@ fn emit_orphan_check_error<'tcx>(
                         }
                         pointer.push(errors::OnlyCurrentTraitsPointer { span, pointer: ty });
                     }
+                    ty::Adt(adt_def, _) => adt.push(errors::OnlyCurrentTraitsAdt {
+                        span,
+                        name: tcx.def_path_str(adt_def.did()),
+                    }),
                     _ => ty_diag.push(errors::OnlyCurrentTraitsTy { span, ty }),
                 }
             }
@@ -379,6 +380,7 @@ fn emit_orphan_check_error<'tcx>(
                     name,
                     pointer,
                     ty: ty_diag,
+                    adt,
                     sugg,
                 },
                 _ if self_ty.is_primitive() => errors::OnlyCurrentTraits::Primitive {
@@ -389,6 +391,7 @@ fn emit_orphan_check_error<'tcx>(
                     name,
                     pointer,
                     ty: ty_diag,
+                    adt,
                     sugg,
                 },
                 _ => errors::OnlyCurrentTraits::Arbitrary {
@@ -399,6 +402,7 @@ fn emit_orphan_check_error<'tcx>(
                     name,
                     pointer,
                     ty: ty_diag,
+                    adt,
                     sugg,
                 },
             };
diff --git a/compiler/rustc_hir_analysis/src/errors.rs b/compiler/rustc_hir_analysis/src/errors.rs
index fb919714afd..6595ee542e0 100644
--- a/compiler/rustc_hir_analysis/src/errors.rs
+++ b/compiler/rustc_hir_analysis/src/errors.rs
@@ -1395,6 +1395,8 @@ pub enum OnlyCurrentTraits<'a> {
         #[subdiagnostic]
         ty: Vec<OnlyCurrentTraitsTy<'a>>,
         #[subdiagnostic]
+        adt: Vec<OnlyCurrentTraitsAdt>,
+        #[subdiagnostic]
         sugg: Option<OnlyCurrentTraitsPointerSugg<'a>>,
     },
     #[diag(hir_analysis_only_current_traits_primitive, code = E0117)]
@@ -1415,6 +1417,8 @@ pub enum OnlyCurrentTraits<'a> {
         #[subdiagnostic]
         ty: Vec<OnlyCurrentTraitsTy<'a>>,
         #[subdiagnostic]
+        adt: Vec<OnlyCurrentTraitsAdt>,
+        #[subdiagnostic]
         sugg: Option<OnlyCurrentTraitsPointerSugg<'a>>,
     },
     #[diag(hir_analysis_only_current_traits_arbitrary, code = E0117)]
@@ -1435,6 +1439,8 @@ pub enum OnlyCurrentTraits<'a> {
         #[subdiagnostic]
         ty: Vec<OnlyCurrentTraitsTy<'a>>,
         #[subdiagnostic]
+        adt: Vec<OnlyCurrentTraitsAdt>,
+        #[subdiagnostic]
         sugg: Option<OnlyCurrentTraitsPointerSugg<'a>>,
     },
 }
@@ -1445,7 +1451,6 @@ pub struct OnlyCurrentTraitsOpaque {
     #[primary_span]
     pub span: Span,
 }
-
 #[derive(Subdiagnostic)]
 #[label(hir_analysis_only_current_traits_foreign)]
 pub struct OnlyCurrentTraitsForeign {
@@ -1478,6 +1483,14 @@ pub struct OnlyCurrentTraitsTy<'a> {
 }
 
 #[derive(Subdiagnostic)]
+#[label(hir_analysis_only_current_traits_adt)]
+pub struct OnlyCurrentTraitsAdt {
+    #[primary_span]
+    pub span: Span,
+    pub name: String,
+}
+
+#[derive(Subdiagnostic)]
 #[multipart_suggestion(
     hir_analysis_only_current_traits_pointer_sugg,
     applicability = "maybe-incorrect"