about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-06-09 10:17:08 +0200
committerGitHub <noreply@github.com>2024-06-09 10:17:08 +0200
commit39fe991dd93840c4e73f6d5f49fe67a2956c2060 (patch)
tree2e2035773e1ae64b0450f784ae49f04a9c070743
parent13423befc40fffe23ccc6dd06868142cff9428fe (diff)
parent1293ef735e251f8062d0a34a737fc675486afb74 (diff)
Rollup merge of #126137 - Enselic:normalize-generic-arg, r=compiler-errors
tests: Add ui/higher-ranked/trait-bounds/normalize-generic-arg.rs

This adds a regression test for an ICE "accidentally" fixed by https://github.com/rust-lang/rust/pull/101947 that does not add a test for this particular case.

Closes #107564.

I have confirmed the added test code fails with `nightly-2023-01-09` (and passes with `nightly-2023-01-10` and of course recent `nightly`).
-rw-r--r--tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.next.stderr9
-rw-r--r--tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.rs30
2 files changed, 39 insertions, 0 deletions
diff --git a/tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.next.stderr b/tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.next.stderr
new file mode 100644
index 00000000000..14a3d5e178d
--- /dev/null
+++ b/tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.next.stderr
@@ -0,0 +1,9 @@
+error[E0284]: type annotations needed: cannot satisfy `for<'a> <_ as Trait<'a>>::Assoc <: <T as Trait<'_>>::Assoc`
+  --> $DIR/rigid-equate-projections-in-higher-ranked-fn-signature.rs:27:50
+   |
+LL |     let _: for<'a> fn(<_ as Trait<'a>>::Assoc) = foo::<T>();
+   |                                                  ^^^^^^^^^^ cannot satisfy `for<'a> <_ as Trait<'a>>::Assoc <: <T as Trait<'_>>::Assoc`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0284`.
diff --git a/tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.rs b/tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.rs
new file mode 100644
index 00000000000..10dbc2a4a82
--- /dev/null
+++ b/tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.rs
@@ -0,0 +1,30 @@
+//@ revisions: current next
+//@[current] check-pass
+//@[next] compile-flags: -Znext-solver
+//@[next] check-fail
+//@ ignore-compare-mode-next-solver (explicit revisions)
+
+/// This triggers an ICE with (and without) `--emit metadata` using the old
+/// trait solver:
+/// ```
+/// rustc +nightly-2023-01-09 \
+///   tests/ui/higher-ranked/trait-bounds/rigid-equate-projections-in-higher-ranked-fn-signature.rs
+/// ```
+/// The ICE was unknowingly fixed by
+/// <https://github.com/rust-lang/rust/pull/101947> in `nightly-2023-01-10`.
+/// This is a regression test for that fixed ICE. For the next solver we simply
+/// make sure there is a compiler error.
+
+trait Trait<'a> {
+    type Assoc;
+}
+
+fn foo<T: for<'a> Trait<'a>>() -> for<'a> fn(<T as Trait<'a>>::Assoc) {
+    todo!()
+}
+
+fn bar<T: for<'a> Trait<'a>>() {
+    let _: for<'a> fn(<_ as Trait<'a>>::Assoc) = foo::<T>(); //[next]~ ERROR type annotations needed
+}
+
+fn main() {}