about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBryanskiy <ivakin.kir@gmail.com>2024-06-10 21:21:46 +0300
committerBryanskiy <ivakin.kir@gmail.com>2024-06-10 21:27:25 +0300
commit6f78e6265a6b43ea53abf048efa688fa0cdb33d9 (patch)
treed1cc0f1301365e147670e4d8a63ff4b52703911c
parent06194cadcd0948a7100b46737f61e82b8c00d632 (diff)
downloadrust-6f78e6265a6b43ea53abf048efa688fa0cdb33d9.tar.gz
rust-6f78e6265a6b43ea53abf048efa688fa0cdb33d9.zip
Delegation: fix ICE on recursive delegation
-rw-r--r--compiler/rustc_ast_lowering/src/delegation.rs4
-rw-r--r--tests/crashes/124347.rs4
-rw-r--r--tests/ui/delegation/ice-issue-124347.rs12
-rw-r--r--tests/ui/delegation/ice-issue-124347.stderr14
4 files changed, 29 insertions, 5 deletions
diff --git a/compiler/rustc_ast_lowering/src/delegation.rs b/compiler/rustc_ast_lowering/src/delegation.rs
index 27f8a6eae02..d9dd0b3bca5 100644
--- a/compiler/rustc_ast_lowering/src/delegation.rs
+++ b/compiler/rustc_ast_lowering/src/delegation.rs
@@ -67,7 +67,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
             return false;
         };
         if let Some(local_sig_id) = sig_id.as_local() {
-            self.resolver.delegation_fn_sigs[&local_sig_id].has_self
+            // The value may be missing due to recursive delegation.
+            // Error will be emmited later during HIR ty lowering.
+            self.resolver.delegation_fn_sigs.get(&local_sig_id).map_or(false, |sig| sig.has_self)
         } else {
             match self.tcx.def_kind(sig_id) {
                 DefKind::Fn => false,
diff --git a/tests/crashes/124347.rs b/tests/crashes/124347.rs
deleted file mode 100644
index d2bc555fe1c..00000000000
--- a/tests/crashes/124347.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-//@ known-bug: #124347
-trait Trait: ToReuse {
-    reuse Trait::lolno { &self.0 };
-}
diff --git a/tests/ui/delegation/ice-issue-124347.rs b/tests/ui/delegation/ice-issue-124347.rs
new file mode 100644
index 00000000000..82a96055099
--- /dev/null
+++ b/tests/ui/delegation/ice-issue-124347.rs
@@ -0,0 +1,12 @@
+#![feature(fn_delegation)]
+#![allow(incomplete_features)]
+
+trait Trait {
+    reuse Trait::foo { &self.0 }
+    //~^ ERROR recursive delegation is not supported yet
+}
+
+reuse foo;
+//~^ ERROR recursive delegation is not supported yet
+
+fn main() {}
diff --git a/tests/ui/delegation/ice-issue-124347.stderr b/tests/ui/delegation/ice-issue-124347.stderr
new file mode 100644
index 00000000000..5a3f4525d29
--- /dev/null
+++ b/tests/ui/delegation/ice-issue-124347.stderr
@@ -0,0 +1,14 @@
+error: recursive delegation is not supported yet
+  --> $DIR/ice-issue-124347.rs:5:18
+   |
+LL |     reuse Trait::foo { &self.0 }
+   |                  ^^^ callee defined here
+
+error: recursive delegation is not supported yet
+  --> $DIR/ice-issue-124347.rs:9:7
+   |
+LL | reuse foo;
+   |       ^^^ callee defined here
+
+error: aborting due to 2 previous errors
+