about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorFelix S. Klock II <pnkfelix@pnkfx.org>2019-07-09 13:57:22 +0200
committerFelix S. Klock II <pnkfelix@pnkfx.org>2019-07-09 13:57:22 +0200
commit837fe7bbe354557c9323b1b9d288584fa077f950 (patch)
treebe343219754ee1ec1999adca024193ae5260d8a7 /src
parent50840ee851c7059e6261b2d961d5386e6763e963 (diff)
downloadrust-837fe7bbe354557c9323b1b9d288584fa077f950.tar.gz
rust-837fe7bbe354557c9323b1b9d288584fa077f950.zip
Regression test.
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/hrtb/issue-62203-hrtb-ice.rs50
-rw-r--r--src/test/ui/hrtb/issue-62203-hrtb-ice.stderr22
2 files changed, 72 insertions, 0 deletions
diff --git a/src/test/ui/hrtb/issue-62203-hrtb-ice.rs b/src/test/ui/hrtb/issue-62203-hrtb-ice.rs
new file mode 100644
index 00000000000..454d7e5e9cd
--- /dev/null
+++ b/src/test/ui/hrtb/issue-62203-hrtb-ice.rs
@@ -0,0 +1,50 @@
+trait T0<'a, A> {
+    type O;
+}
+
+struct L<T> {
+    f: T,
+}
+
+// explicitly named variants of what one would normally denote by the
+// unit type `()`. Why do this? So that we can differentiate them in
+// the diagnostic output.
+struct Unit1;
+struct Unit2;
+struct Unit3;
+struct Unit4;
+
+impl<'a, A, T> T0<'a, A> for L<T>
+where
+    T: FnMut(A) -> Unit3,
+{
+    type O = T::Output;
+}
+
+trait T1: for<'r> Ty<'r> {
+    fn m<'a, B: Ty<'a>, F>(&self, f: F) -> Unit1
+    where
+        F: for<'r> T0<'r, (<Self as Ty<'r>>::V,), O = <B as Ty<'r>>::V>,
+    {
+        unimplemented!();
+    }
+}
+
+trait Ty<'a> {
+    type V;
+}
+
+fn main() {
+    let v = Unit2.m(
+        //~^ ERROR type mismatch
+        //~| ERROR type mismatch
+        L {
+            f : |x| { drop(x); Unit4 }
+        });
+}
+
+impl<'a> Ty<'a> for Unit2 {
+    type V = &'a u8;
+}
+
+impl T1 for Unit2 {}
diff --git a/src/test/ui/hrtb/issue-62203-hrtb-ice.stderr b/src/test/ui/hrtb/issue-62203-hrtb-ice.stderr
new file mode 100644
index 00000000000..c2d0e0c2a26
--- /dev/null
+++ b/src/test/ui/hrtb/issue-62203-hrtb-ice.stderr
@@ -0,0 +1,22 @@
+error[E0271]: type mismatch resolving `for<'r> <L<[closure@$DIR/issue-62203-hrtb-ice.rs:42:17: 42:39]> as T0<'r, (<Unit2 as Ty<'r>>::V,)>>::O == <_ as Ty<'r>>::V`
+  --> $DIR/issue-62203-hrtb-ice.rs:38:19
+   |
+LL |     let v = Unit2.m(
+   |                   ^ expected struct `Unit4`, found associated type
+   |
+   = note: expected type `Unit4`
+              found type `<_ as Ty<'_>>::V`
+
+error[E0271]: type mismatch resolving `<[closure@$DIR/issue-62203-hrtb-ice.rs:42:17: 42:39] as std::ops::FnOnce<((&u8,),)>>::Output == Unit3`
+  --> $DIR/issue-62203-hrtb-ice.rs:38:19
+   |
+LL |     let v = Unit2.m(
+   |                   ^ expected struct `Unit4`, found struct `Unit3`
+   |
+   = note: expected type `Unit4`
+              found type `Unit3`
+   = note: required because of the requirements on the impl of `for<'r> T0<'r, (<Unit2 as Ty<'r>>::V,)>` for `L<[closure@$DIR/issue-62203-hrtb-ice.rs:42:17: 42:39]>`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0271`.