summaryrefslogtreecommitdiffstats
path: root/src/test/ui/unsized/unsized3.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/unsized/unsized3.rs')
-rw-r--r--src/test/ui/unsized/unsized3.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/test/ui/unsized/unsized3.rs b/src/test/ui/unsized/unsized3.rs
new file mode 100644
index 000000000..af76aca2c
--- /dev/null
+++ b/src/test/ui/unsized/unsized3.rs
@@ -0,0 +1,50 @@
+// Test sized-ness checking in substitution within fn bodies..
+
+use std::marker;
+
+// Unbounded.
+fn f1<X: ?Sized>(x: &X) {
+ f2::<X>(x);
+ //~^ ERROR the size for values of type
+}
+fn f2<X>(x: &X) {
+}
+
+// Bounded.
+trait T {
+ fn foo(&self) { }
+}
+fn f3<X: ?Sized + T>(x: &X) {
+ f4::<X>(x);
+ //~^ ERROR the size for values of type
+}
+fn f4<X: T>(x: &X) {
+}
+
+fn f5<Y>(x: &Y) {}
+fn f6<X: ?Sized>(x: &X) {}
+
+// Test with unsized struct.
+struct S<X: ?Sized> {
+ x: X,
+}
+
+fn f8<X: ?Sized>(x1: &S<X>, x2: &S<X>) {
+ f5(x1);
+ //~^ ERROR the size for values of type
+ f6(x2); // ok
+}
+
+// Test some tuples.
+fn f9<X: ?Sized>(x1: Box<S<X>>) {
+ f5(&(*x1, 34));
+ //~^ ERROR the size for values of type
+}
+
+fn f10<X: ?Sized>(x1: Box<S<X>>) {
+ f5(&(32, *x1));
+ //~^ ERROR the size for values of type
+ //~| ERROR the size for values of type
+}
+
+pub fn main() {}