about summary refs log tree commit diff
path: root/compiler/rustc_trait_selection/src
diff options
context:
space:
mode:
authormejrs <59372212+mejrs@users.noreply.github.com>2025-03-29 11:46:03 +0100
committermejrs <59372212+mejrs@users.noreply.github.com>2025-04-14 00:12:37 +0200
commit9abaa9d4dffeb897a1dbff97d32d3b6ac190be21 (patch)
tree6d3be36cbe4c99b99d56af0f7c4ec00db9f3df42 /compiler/rustc_trait_selection/src
parent8586cad77c175a0c2ce11c0579c537aa195e6da2 (diff)
downloadrust-9abaa9d4dffeb897a1dbff97d32d3b6ac190be21.tar.gz
rust-9abaa9d4dffeb897a1dbff97d32d3b6ac190be21.zip
Disable usage on trait impls and aliases
Diffstat (limited to 'compiler/rustc_trait_selection/src')
-rw-r--r--compiler/rustc_trait_selection/src/error_reporting/traits/on_unimplemented.rs17
1 files changed, 13 insertions, 4 deletions
diff --git a/compiler/rustc_trait_selection/src/error_reporting/traits/on_unimplemented.rs b/compiler/rustc_trait_selection/src/error_reporting/traits/on_unimplemented.rs
index 0478f3a7f11..ca51f177f96 100644
--- a/compiler/rustc_trait_selection/src/error_reporting/traits/on_unimplemented.rs
+++ b/compiler/rustc_trait_selection/src/error_reporting/traits/on_unimplemented.rs
@@ -553,6 +553,13 @@ impl<'tcx> OnUnimplementedDirective {
     }
 
     pub fn of_item(tcx: TyCtxt<'tcx>, item_def_id: DefId) -> Result<Option<Self>, ErrorGuaranteed> {
+        if !tcx.is_trait(item_def_id) {
+            // It could be a trait_alias (`trait MyTrait = SomeOtherTrait`)
+            // or an implementation (`impl MyTrait for Foo {}`)
+            //
+            // We don't support those.
+            return Ok(None);
+        }
         if let Some(attr) = tcx.get_attr(item_def_id, sym::rustc_on_unimplemented) {
             return Self::parse_attribute(attr, false, tcx, item_def_id);
         } else {
@@ -782,8 +789,10 @@ impl<'tcx> OnUnimplementedFormatString {
         Ok(result)
     }
 
-    fn verify(&self, tcx: TyCtxt<'tcx>, item_def_id: DefId) -> Result<(), ErrorGuaranteed> {
-        let trait_def_id = if tcx.is_trait(item_def_id) { item_def_id } else { return Ok(()) };
+    fn verify(&self, tcx: TyCtxt<'tcx>, trait_def_id: DefId) -> Result<(), ErrorGuaranteed> {
+        if !tcx.is_trait(trait_def_id) {
+            return Ok(());
+        };
 
         let ctx = if self.is_diagnostic_namespace_variant {
             Ctx::DiagnosticOnUnimplemented { tcx, trait_def_id }
@@ -810,10 +819,10 @@ impl<'tcx> OnUnimplementedFormatString {
                 // so that users are aware that something is not correct
                 for e in errors {
                     if self.is_diagnostic_namespace_variant {
-                        if let Some(item_def_id) = item_def_id.as_local() {
+                        if let Some(trait_def_id) = trait_def_id.as_local() {
                             tcx.emit_node_span_lint(
                                 UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
-                                tcx.local_def_id_to_hir_id(item_def_id),
+                                tcx.local_def_id_to_hir_id(trait_def_id),
                                 self.span,
                                 WrappedParserError { description: e.description, label: e.label },
                             );