about summary refs log tree commit diff
diff options
context:
space:
mode:
authorranger-ross <rosssullivan101@gmail.com>2024-11-02 17:17:53 +0900
committerranger-ross <rosssullivan101@gmail.com>2024-11-02 22:17:46 +0900
commitb9196757a0c2c9ddbbca4372ca272b0e1fec077f (patch)
tree6165de361ea84b816a3ea3f1b2b6c9ea4d887f1d
parentef972a346668ed4234d1a43ed4ad7ca4e9c58d51 (diff)
downloadrust-b9196757a0c2c9ddbbca4372ca272b0e1fec077f.tar.gz
rust-b9196757a0c2c9ddbbca4372ca272b0e1fec077f.zip
Added regression test for 117446
-rw-r--r--tests/ui/traits/ice-index-out-of-bounds-issue-117446.rs24
-rw-r--r--tests/ui/traits/ice-index-out-of-bounds-issue-117446.stderr33
2 files changed, 57 insertions, 0 deletions
diff --git a/tests/ui/traits/ice-index-out-of-bounds-issue-117446.rs b/tests/ui/traits/ice-index-out-of-bounds-issue-117446.rs
new file mode 100644
index 00000000000..fa31d8b820c
--- /dev/null
+++ b/tests/ui/traits/ice-index-out-of-bounds-issue-117446.rs
@@ -0,0 +1,24 @@
+//@ check-fail
+//
+// Regression for https://github.com/rust-lang/rust/issues/117446
+
+pub struct Repeated<T>(Vec<T>);
+
+trait Foo<'a> {
+    fn outer<D>() -> Option<()>;
+}
+
+impl<'a, T> Foo<'a> for Repeated<T> {
+    fn outer() -> Option<()> {
+        //~^ ERROR  associated function `outer` has 0 type parameters but its trait declaration has 1 type parameter [E0049]
+        //~^^ ERROR mismatched types [E0308]
+        fn inner<Q>(value: Option<()>) -> Repeated<Q> {
+            match value {
+                _ => Self(unimplemented!()),
+                //~^ ERROR can't reference `Self` constructor from outer item [E0401]
+            }
+        }
+    }
+}
+
+fn main() {}
diff --git a/tests/ui/traits/ice-index-out-of-bounds-issue-117446.stderr b/tests/ui/traits/ice-index-out-of-bounds-issue-117446.stderr
new file mode 100644
index 00000000000..ad33a70ed3b
--- /dev/null
+++ b/tests/ui/traits/ice-index-out-of-bounds-issue-117446.stderr
@@ -0,0 +1,33 @@
+error[E0049]: associated function `outer` has 0 type parameters but its trait declaration has 1 type parameter
+  --> $DIR/ice-index-out-of-bounds-issue-117446.rs:12:13
+   |
+LL |     fn outer<D>() -> Option<()>;
+   |              - expected 1 type parameter
+...
+LL |     fn outer() -> Option<()> {
+   |             ^ found 0 type parameters
+
+error[E0308]: mismatched types
+  --> $DIR/ice-index-out-of-bounds-issue-117446.rs:12:19
+   |
+LL |     fn outer() -> Option<()> {
+   |        -----      ^^^^^^^^^^ expected `Option<()>`, found `()`
+   |        |
+   |        implicitly returns `()` as its body has no tail or `return` expression
+   |
+   = note:   expected enum `Option<()>`
+           found unit type `()`
+
+error[E0401]: can't reference `Self` constructor from outer item
+  --> $DIR/ice-index-out-of-bounds-issue-117446.rs:17:22
+   |
+LL | impl<'a, T> Foo<'a> for Repeated<T> {
+   | ----------------------------------- the inner item doesn't inherit generics from this impl, so `Self` is invalid to reference
+...
+LL |                 _ => Self(unimplemented!()),
+   |                      ^^^^ help: replace `Self` with the actual type: `Repeated`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0049, E0308, E0401.
+For more information about an error, try `rustc --explain E0049`.