about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorlcnr <rust@lcnr.de>2022-08-25 11:12:04 +0200
committerlcnr <rust@lcnr.de>2022-08-25 11:12:04 +0200
commitef7bda3b62b7d6821acb4603e2c72b7120b02059 (patch)
tree68f1c7c0dd88f530b1a84797b167f188ad9141b9 /src
parent7e3e8a816f91fda5c6e05c659d7038747aff0b55 (diff)
no unnormalized types for implied bounds
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/implied-bounds/impl-header-unnormalized-types.rs28
-rw-r--r--src/test/ui/implied-bounds/impl-header-unnormalized-types.stderr20
2 files changed, 48 insertions, 0 deletions
diff --git a/src/test/ui/implied-bounds/impl-header-unnormalized-types.rs b/src/test/ui/implied-bounds/impl-header-unnormalized-types.rs
new file mode 100644
index 00000000000..d84539f8ab5
--- /dev/null
+++ b/src/test/ui/implied-bounds/impl-header-unnormalized-types.rs
@@ -0,0 +1,28 @@
+struct Foo<T>(T);
+
+trait GoodBye {
+    type Forget;
+}
+impl<T> GoodBye for T {
+    type Forget = ();
+}
+
+trait NeedsWf<'a, 'b> {
+    type Assoc;
+}
+
+impl<'a, 'b> NeedsWf<'a, 'b> for Foo<<&'a &'b () as GoodBye>::Forget> {
+    type Assoc = &'a &'b ();
+    //~^ ERROR in type `&'a &'b ()`, reference has a longer lifetime than the data it references
+}
+
+fn needs_wf<'a, 'b, T: NeedsWf<'a, 'b>>() {}
+
+fn foo<'a: 'a, 'b: 'b>(_: &'b String) {
+    needs_wf::<'a, 'b, Foo<()>>();
+}
+
+fn main() {
+    let x = String::from("hello");
+    foo::<'static, '_>(&x);
+}
diff --git a/src/test/ui/implied-bounds/impl-header-unnormalized-types.stderr b/src/test/ui/implied-bounds/impl-header-unnormalized-types.stderr
new file mode 100644
index 00000000000..88abd5f54c2
--- /dev/null
+++ b/src/test/ui/implied-bounds/impl-header-unnormalized-types.stderr
@@ -0,0 +1,20 @@
+error[E0491]: in type `&'a &'b ()`, reference has a longer lifetime than the data it references
+  --> $DIR/impl-header-unnormalized-types.rs:15:18
+   |
+LL |     type Assoc = &'a &'b ();
+   |                  ^^^^^^^^^^
+   |
+note: the pointer is valid for the lifetime `'a` as defined here
+  --> $DIR/impl-header-unnormalized-types.rs:14:6
+   |
+LL | impl<'a, 'b> NeedsWf<'a, 'b> for Foo<<&'a &'b () as GoodBye>::Forget> {
+   |      ^^
+note: but the referenced data is only valid for the lifetime `'b` as defined here
+  --> $DIR/impl-header-unnormalized-types.rs:14:10
+   |
+LL | impl<'a, 'b> NeedsWf<'a, 'b> for Foo<<&'a &'b () as GoodBye>::Forget> {
+   |          ^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0491`.