about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2022-02-01 16:41:32 +0000
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2022-02-02 15:40:12 +0000
commitbae04fb3ded72c71a660d34749d83d2752580052 (patch)
treea9e7ed872759de471363d56befe3247e22749859
parent7a1ccf9a03cc0be995a7d8c8f3873c09e7d92f90 (diff)
downloadrust-bae04fb3ded72c71a660d34749d83d2752580052.tar.gz
rust-bae04fb3ded72c71a660d34749d83d2752580052.zip
Ensure we error in case of non-higher-kinded lifetimes
-rw-r--r--src/test/ui/impl-trait/issues/issue-88236-2.rs23
-rw-r--r--src/test/ui/impl-trait/issues/issue-88236-2.stderr20
-rw-r--r--src/test/ui/impl-trait/issues/issue-88236.rs6
-rw-r--r--src/test/ui/type-alias-impl-trait/issue-93411.rs2
4 files changed, 49 insertions, 2 deletions
diff --git a/src/test/ui/impl-trait/issues/issue-88236-2.rs b/src/test/ui/impl-trait/issues/issue-88236-2.rs
new file mode 100644
index 00000000000..f89ab7fbd36
--- /dev/null
+++ b/src/test/ui/impl-trait/issues/issue-88236-2.rs
@@ -0,0 +1,23 @@
+// this used to cause stack overflows
+
+trait Hrtb<'a> {
+    type Assoc;
+}
+
+impl<'a> Hrtb<'a> for () {
+    type Assoc = ();
+}
+
+impl<'a> Hrtb<'a> for &'a () {
+    type Assoc = ();
+}
+
+fn make_impl() -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {}
+fn make_weird_impl<'b>(x: &'b ()) -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {
+    &() //~ ERROR implementation of `Hrtb` is not general enough
+}
+fn make_bad_impl<'b>(x: &'b ()) -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {
+    x //~ ERROR implementation of `Hrtb` is not general enough
+}
+
+fn main() {}
diff --git a/src/test/ui/impl-trait/issues/issue-88236-2.stderr b/src/test/ui/impl-trait/issues/issue-88236-2.stderr
new file mode 100644
index 00000000000..95c4a528036
--- /dev/null
+++ b/src/test/ui/impl-trait/issues/issue-88236-2.stderr
@@ -0,0 +1,20 @@
+error: implementation of `Hrtb` is not general enough
+  --> $DIR/issue-88236-2.rs:17:5
+   |
+LL |     &()
+   |     ^^^ implementation of `Hrtb` is not general enough
+   |
+   = note: `Hrtb<'0>` would have to be implemented for the type `&()`, for any lifetime `'0`...
+   = note: ...but `Hrtb<'1>` is actually implemented for the type `&'1 ()`, for some specific lifetime `'1`
+
+error: implementation of `Hrtb` is not general enough
+  --> $DIR/issue-88236-2.rs:20:5
+   |
+LL |     x
+   |     ^ implementation of `Hrtb` is not general enough
+   |
+   = note: `&()` must implement `Hrtb<'0>`, for any lifetime `'0`...
+   = note: ...but `Hrtb<'_>` is actually implemented for the type `&()`
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/impl-trait/issues/issue-88236.rs b/src/test/ui/impl-trait/issues/issue-88236.rs
index 3bab46979ef..2ea35270a7e 100644
--- a/src/test/ui/impl-trait/issues/issue-88236.rs
+++ b/src/test/ui/impl-trait/issues/issue-88236.rs
@@ -10,6 +10,10 @@ impl<'a> Hrtb<'a> for () {
     type Assoc = ();
 }
 
+impl<'a> Hrtb<'a> for &'a () {
+    type Assoc = ();
+}
+
 fn make_impl() -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {}
 
-fn main() {}
\ No newline at end of file
+fn main() {}
diff --git a/src/test/ui/type-alias-impl-trait/issue-93411.rs b/src/test/ui/type-alias-impl-trait/issue-93411.rs
index f0f2bcd7bb2..1f8c789267d 100644
--- a/src/test/ui/type-alias-impl-trait/issue-93411.rs
+++ b/src/test/ui/type-alias-impl-trait/issue-93411.rs
@@ -16,4 +16,4 @@ fn main() {
 type BlahFut<'a> = impl Future<Output = ()> + Send + 'a;
 fn blah<'a>(_value: &'a u8) -> BlahFut<'a> {
     async {}
-}
\ No newline at end of file
+}