about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/ui/unsized/param-mentioned-by-different-field.rs10
-rw-r--r--src/test/ui/unsized/param-mentioned-by-different-field.stderr14
2 files changed, 24 insertions, 0 deletions
diff --git a/src/test/ui/unsized/param-mentioned-by-different-field.rs b/src/test/ui/unsized/param-mentioned-by-different-field.rs
new file mode 100644
index 00000000000..cda94b306d3
--- /dev/null
+++ b/src/test/ui/unsized/param-mentioned-by-different-field.rs
@@ -0,0 +1,10 @@
+// We must not allow this with our current setup as `T`
+// is mentioned both in the tail of `Foo` and by another
+// field.
+struct Foo<T: ?Sized>(Box<T>, T);
+
+fn main() {
+    let x: Foo<[u8; 1]> = Foo(Box::new([2]), [3]);
+    let y: &Foo<[u8]> = &x; //~ ERROR mismatched types
+    assert_eq!(y.0.len(), 1);
+}
diff --git a/src/test/ui/unsized/param-mentioned-by-different-field.stderr b/src/test/ui/unsized/param-mentioned-by-different-field.stderr
new file mode 100644
index 00000000000..d18fa6456f3
--- /dev/null
+++ b/src/test/ui/unsized/param-mentioned-by-different-field.stderr
@@ -0,0 +1,14 @@
+error[E0308]: mismatched types
+  --> $DIR/param-mentioned-by-different-field.rs:8:25
+   |
+LL |     let y: &Foo<[u8]> = &x;
+   |            ----------   ^^ expected slice `[u8]`, found array `[u8; 1]`
+   |            |
+   |            expected due to this
+   |
+   = note: expected reference `&Foo<[u8]>`
+              found reference `&Foo<[u8; 1]>`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.