summaryrefslogtreecommitdiffstats
path: root/tests/ui/wf
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/wf')
-rw-r--r--tests/ui/wf/wf-convert-unsafe-trait-obj-box.stderr9
-rw-r--r--tests/ui/wf/wf-convert-unsafe-trait-obj.stderr9
-rw-r--r--tests/ui/wf/wf-in-fn-type-implicit.rs37
-rw-r--r--tests/ui/wf/wf-in-where-clause-static.rs23
-rw-r--r--tests/ui/wf/wf-normalization-sized.rs19
-rw-r--r--tests/ui/wf/wf-unsafe-trait-obj-match.stderr6
6 files changed, 87 insertions, 16 deletions
diff --git a/tests/ui/wf/wf-convert-unsafe-trait-obj-box.stderr b/tests/ui/wf/wf-convert-unsafe-trait-obj-box.stderr
index 6cf4f33f9..40a25c7df 100644
--- a/tests/ui/wf/wf-convert-unsafe-trait-obj-box.stderr
+++ b/tests/ui/wf/wf-convert-unsafe-trait-obj-box.stderr
@@ -11,8 +11,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `Box<S>` to implement `CoerceUnsized<Box<dyn Trait>>`
- = note: required by cast to type `Box<dyn Trait>`
+ = note: required for the cast from `Box<S>` to `Box<dyn Trait>`
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/wf-convert-unsafe-trait-obj-box.rs:17:15
@@ -27,8 +26,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `Box<S>` to implement `CoerceUnsized<Box<dyn Trait>>`
- = note: required by cast to type `Box<(dyn Trait + 'static)>`
+ = note: required for the cast from `Box<S>` to `Box<(dyn Trait + 'static)>`
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/wf-convert-unsafe-trait-obj-box.rs:15:5
@@ -43,8 +41,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `Box<S>` to implement `CoerceUnsized<Box<dyn Trait>>`
- = note: required by cast to type `Box<dyn Trait>`
+ = note: required for the cast from `Box<S>` to `Box<dyn Trait>`
error: aborting due to 3 previous errors
diff --git a/tests/ui/wf/wf-convert-unsafe-trait-obj.stderr b/tests/ui/wf/wf-convert-unsafe-trait-obj.stderr
index c9bd4549a..e2c71df2f 100644
--- a/tests/ui/wf/wf-convert-unsafe-trait-obj.stderr
+++ b/tests/ui/wf/wf-convert-unsafe-trait-obj.stderr
@@ -11,8 +11,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `&S` to implement `CoerceUnsized<&dyn Trait>`
- = note: required by cast to type `&dyn Trait`
+ = note: required for the cast from `&S` to `&dyn Trait`
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/wf-convert-unsafe-trait-obj.rs:17:17
@@ -27,8 +26,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `&S` to implement `CoerceUnsized<&dyn Trait>`
- = note: required by cast to type `&dyn Trait`
+ = note: required for the cast from `&S` to `&dyn Trait`
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/wf-convert-unsafe-trait-obj.rs:15:5
@@ -43,8 +41,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `&S` to implement `CoerceUnsized<&dyn Trait>`
- = note: required by cast to type `&dyn Trait`
+ = note: required for the cast from `&S` to `&dyn Trait`
error: aborting due to 3 previous errors
diff --git a/tests/ui/wf/wf-in-fn-type-implicit.rs b/tests/ui/wf/wf-in-fn-type-implicit.rs
new file mode 100644
index 000000000..c5ff92c88
--- /dev/null
+++ b/tests/ui/wf/wf-in-fn-type-implicit.rs
@@ -0,0 +1,37 @@
+// check-pass
+// known-bug: #104005
+
+// Should fail. Function type parameters with implicit type annotations are not
+// checked for well-formedness, which allows incorrect borrowing.
+
+// In contrast, user annotations are always checked for well-formedness, and the
+// commented code below is correctly rejected by the borrow checker.
+
+use std::fmt::Display;
+
+trait Displayable {
+ fn display(self) -> Box<dyn Display>;
+}
+
+impl<T: Display> Displayable for (T, Option<&'static T>) {
+ fn display(self) -> Box<dyn Display> {
+ Box::new(self.0)
+ }
+}
+
+fn extend_lt<T, U>(val: T) -> Box<dyn Display>
+where
+ (T, Option<U>): Displayable,
+{
+ Displayable::display((val, None))
+}
+
+fn main() {
+ // *incorrectly* compiles
+ let val = extend_lt(&String::from("blah blah blah"));
+ println!("{}", val);
+
+ // *correctly* fails to compile
+ // let val = extend_lt::<_, &_>(&String::from("blah blah blah"));
+ // println!("{}", val);
+}
diff --git a/tests/ui/wf/wf-in-where-clause-static.rs b/tests/ui/wf/wf-in-where-clause-static.rs
new file mode 100644
index 000000000..86722afdf
--- /dev/null
+++ b/tests/ui/wf/wf-in-where-clause-static.rs
@@ -0,0 +1,23 @@
+// check-pass
+// known-bug: #98117
+
+// Should fail. Functions are responsible for checking the well-formedness of
+// their own where clauses, so this should fail and require an explicit bound
+// `T: 'static`.
+
+use std::fmt::Display;
+
+trait Static: 'static {}
+impl<T> Static for &'static T {}
+
+fn foo<S: Display>(x: S) -> Box<dyn Display>
+where
+ &'static S: Static,
+{
+ Box::new(x)
+}
+
+fn main() {
+ let s = foo(&String::from("blah blah blah"));
+ println!("{}", s);
+}
diff --git a/tests/ui/wf/wf-normalization-sized.rs b/tests/ui/wf/wf-normalization-sized.rs
new file mode 100644
index 000000000..473fc79a8
--- /dev/null
+++ b/tests/ui/wf/wf-normalization-sized.rs
@@ -0,0 +1,19 @@
+// check-pass
+// known-bug: #100041
+
+// Should fail. Normalization can bypass well-formedness checking.
+// `[[[[[[u8]]]]]]` is not a well-formed type since size of type `[u8]` cannot
+// be known at compile time (since `Sized` is not implemented for `[u8]`).
+
+trait WellUnformed {
+ type RequestNormalize;
+}
+
+impl<T: ?Sized> WellUnformed for T {
+ type RequestNormalize = ();
+}
+
+const _: <[[[[[[u8]]]]]] as WellUnformed>::RequestNormalize = ();
+const _: <Vec<str> as WellUnformed>::RequestNormalize = ();
+
+fn main() {}
diff --git a/tests/ui/wf/wf-unsafe-trait-obj-match.stderr b/tests/ui/wf/wf-unsafe-trait-obj-match.stderr
index d2b416309..66504e440 100644
--- a/tests/ui/wf/wf-unsafe-trait-obj-match.stderr
+++ b/tests/ui/wf/wf-unsafe-trait-obj-match.stderr
@@ -25,8 +25,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `&S` to implement `CoerceUnsized<&dyn Trait>`
- = note: required by cast to type `&dyn Trait`
+ = note: required for the cast from `&S` to `&dyn Trait`
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/wf-unsafe-trait-obj-match.rs:25:25
@@ -45,8 +44,7 @@ LL | trait Trait: Sized {}
| ----- ^^^^^ ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
- = note: required for `&R` to implement `CoerceUnsized<&dyn Trait>`
- = note: required by cast to type `&dyn Trait`
+ = note: required for the cast from `&R` to `&dyn Trait`
error: aborting due to 3 previous errors