about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorOli Scherer <github333195615777966@oli-obk.de>2025-02-25 09:52:55 +0000
committerOli Scherer <github333195615777966@oli-obk.de>2025-03-11 12:05:02 +0000
commit3e4e65ee8b8c5d7a1916fd6377901416f06dca4d (patch)
treefbe24801482bb43680abaaf9128bf47741fca828 /compiler
parentcb4751d4b87e1c8ebdeb381abe3785486a59968e (diff)
Test invalid `define_opaques` attributes
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_ast_lowering/src/item.rs26
1 files changed, 15 insertions, 11 deletions
diff --git a/compiler/rustc_ast_lowering/src/item.rs b/compiler/rustc_ast_lowering/src/item.rs
index 0aa42a0c4e7..302936ad1a1 100644
--- a/compiler/rustc_ast_lowering/src/item.rs
+++ b/compiler/rustc_ast_lowering/src/item.rs
@@ -1683,17 +1683,21 @@ impl<'hir> LoweringContext<'_, 'hir> {
         let Some(define_opaque) = define_opaque.as_ref() else {
             return;
         };
-        let define_opaque = define_opaque
-            .iter()
-            // TODO: error reporting for non-local items being mentioned and tests that go through these code paths
-            .map(|(id, _path)| {
-                self.resolver
-                    .get_partial_res(*id)
-                    .unwrap()
-                    .expect_full_res()
-                    .def_id()
-                    .expect_local()
-            });
+        let define_opaque = define_opaque.iter().filter_map(|(id, path)| {
+            let res = self.resolver.get_partial_res(*id).unwrap();
+            let Some(did) = res.expect_full_res().opt_def_id() else {
+                self.dcx().span_delayed_bug(path.span, "should have errored in resolve");
+                return None;
+            };
+            let Some(did) = did.as_local() else {
+                self.dcx().span_err(
+                    path.span,
+                    "only opaque types defined in the local crate can be defined",
+                );
+                return None;
+            };
+            Some(did)
+        });
         let define_opaque = self.arena.alloc_from_iter(define_opaque);
         self.define_opaque = Some(define_opaque);
     }