about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs29
-rw-r--r--tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr11
2 files changed, 40 insertions, 0 deletions
diff --git a/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs
new file mode 100644
index 00000000000..05d205266b4
--- /dev/null
+++ b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs
@@ -0,0 +1,29 @@
+// This test checks that we correctly reject the following unsound code.
+
+trait Lengthen<T> {
+    fn lengthen(self) -> T;
+}
+
+impl<'a> Lengthen<&'a str> for &'a str {
+    fn lengthen(self) -> &'a str { self }
+}
+
+trait Gat {
+    type Gat<'a>: for<'b> Lengthen<Self::Gat<'b>>;
+
+    fn lengthen(s: Self::Gat<'_>) -> Self::Gat<'static> {
+        s.lengthen()
+    }
+}
+
+impl Gat for () {
+    type Gat<'a> = &'a str; //~ ERROR: implementation of `Lengthen` is not general enough
+}
+
+fn main() {
+    let s = "hello, garbage".to_string();
+    let borrow: &'static str = <() as Gat>::lengthen(&s);
+    drop(s);
+
+    println!("{borrow}");
+}
diff --git a/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr
new file mode 100644
index 00000000000..7ea7a7b2de7
--- /dev/null
+++ b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr
@@ -0,0 +1,11 @@
+error: implementation of `Lengthen` is not general enough
+  --> $DIR/gat-bounds-not-checked-with-right-substitutions.rs:20:20
+   |
+LL |     type Gat<'a> = &'a str;
+   |                    ^^^^^^^ implementation of `Lengthen` is not general enough
+   |
+   = note: `Lengthen<&'0 str>` would have to be implemented for the type `&'a str`, for any lifetime `'0`...
+   = note: ...but `Lengthen<&'1 str>` is actually implemented for the type `&'1 str`, for some specific lifetime `'1`
+
+error: aborting due to previous error
+