summaryrefslogtreecommitdiffstats
path: root/tests/ui/object-safety
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/object-safety')
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized.rs17
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized.stderr12
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized_others.rs25
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized_others.stderr21
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.rs17
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.stderr27
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized_used.rs20
-rw-r--r--tests/ui/object-safety/assoc_type_bounds_sized_used.stderr53
8 files changed, 179 insertions, 13 deletions
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized.rs b/tests/ui/object-safety/assoc_type_bounds_sized.rs
index 61ad3cf9d..6d10ceeb1 100644
--- a/tests/ui/object-safety/assoc_type_bounds_sized.rs
+++ b/tests/ui/object-safety/assoc_type_bounds_sized.rs
@@ -1,9 +1,24 @@
+//! This test checks that associated types only need to be
+//! mentioned in trait objects, if they don't require `Self: Sized`.
+
+// check-pass
+
trait Foo {
type Bar
where
Self: Sized;
}
-fn foo(_: &dyn Foo) {} //~ ERROR: the value of the associated type `Bar` (from trait `Foo`) must be specified
+fn foo(_: &dyn Foo) {}
+
+trait Other: Sized {}
+
+trait Boo {
+ type Assoc
+ where
+ Self: Other;
+}
+
+fn boo(_: &dyn Boo) {}
fn main() {}
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized.stderr b/tests/ui/object-safety/assoc_type_bounds_sized.stderr
deleted file mode 100644
index 49d624f9b..000000000
--- a/tests/ui/object-safety/assoc_type_bounds_sized.stderr
+++ /dev/null
@@ -1,12 +0,0 @@
-error[E0191]: the value of the associated type `Bar` (from trait `Foo`) must be specified
- --> $DIR/assoc_type_bounds_sized.rs:7:16
- |
-LL | type Bar
- | -------- `Bar` defined here
-...
-LL | fn foo(_: &dyn Foo) {}
- | ^^^ help: specify the associated type: `Foo<Bar = Type>`
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0191`.
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized_others.rs b/tests/ui/object-safety/assoc_type_bounds_sized_others.rs
new file mode 100644
index 000000000..647b72a75
--- /dev/null
+++ b/tests/ui/object-safety/assoc_type_bounds_sized_others.rs
@@ -0,0 +1,25 @@
+//! This test checks that even if some associated types have
+//! `where Self: Sized` bounds, those without still need to be
+//! mentioned in trait objects.
+
+trait Foo {
+ type Bar
+ where
+ Self: Sized;
+ type Bop;
+}
+
+fn foo(_: &dyn Foo) {}
+//~^ ERROR the value of the associated type `Bop` (from trait `Foo`) must be specified
+
+trait Bar {
+ type Bop;
+ type Bar
+ where
+ Self: Sized;
+}
+
+fn bar(_: &dyn Bar) {}
+//~^ ERROR the value of the associated type `Bop` (from trait `Bar`) must be specified
+
+fn main() {}
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized_others.stderr b/tests/ui/object-safety/assoc_type_bounds_sized_others.stderr
new file mode 100644
index 000000000..e4c44334b
--- /dev/null
+++ b/tests/ui/object-safety/assoc_type_bounds_sized_others.stderr
@@ -0,0 +1,21 @@
+error[E0191]: the value of the associated type `Bop` (from trait `Foo`) must be specified
+ --> $DIR/assoc_type_bounds_sized_others.rs:12:16
+ |
+LL | type Bop;
+ | -------- `Bop` defined here
+...
+LL | fn foo(_: &dyn Foo) {}
+ | ^^^ help: specify the associated type: `Foo<Bop = Type>`
+
+error[E0191]: the value of the associated type `Bop` (from trait `Bar`) must be specified
+ --> $DIR/assoc_type_bounds_sized_others.rs:22:16
+ |
+LL | type Bop;
+ | -------- `Bop` defined here
+...
+LL | fn bar(_: &dyn Bar) {}
+ | ^^^ help: specify the associated type: `Bar<Bop = Type>`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0191`.
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.rs b/tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.rs
new file mode 100644
index 000000000..800624e31
--- /dev/null
+++ b/tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.rs
@@ -0,0 +1,17 @@
+// check-pass
+
+trait Foo {
+ type Bar
+ where
+ Self: Sized;
+}
+
+fn foo(_: &dyn Foo<Bar = ()>) {}
+//~^ WARN: unnecessary associated type bound for not object safe associated type
+//~| WARN: unnecessary associated type bound for not object safe associated type
+//~| WARN: unnecessary associated type bound for not object safe associated type
+
+#[allow(unused_associated_type_bounds)]
+fn bar(_: &dyn Foo<Bar = ()>) {}
+
+fn main() {}
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.stderr b/tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.stderr
new file mode 100644
index 000000000..d0a4179fe
--- /dev/null
+++ b/tests/ui/object-safety/assoc_type_bounds_sized_unnecessary.stderr
@@ -0,0 +1,27 @@
+warning: unnecessary associated type bound for not object safe associated type
+ --> $DIR/assoc_type_bounds_sized_unnecessary.rs:9:20
+ |
+LL | fn foo(_: &dyn Foo<Bar = ()>) {}
+ | ^^^^^^^^ help: remove this bound
+ |
+ = note: this associated type has a `where Self: Sized` bound. Thus, while the associated type can be specified, it cannot be used in any way, because trait objects are not `Sized`.
+ = note: `#[warn(unused_associated_type_bounds)]` on by default
+
+warning: unnecessary associated type bound for not object safe associated type
+ --> $DIR/assoc_type_bounds_sized_unnecessary.rs:9:20
+ |
+LL | fn foo(_: &dyn Foo<Bar = ()>) {}
+ | ^^^^^^^^ help: remove this bound
+ |
+ = note: this associated type has a `where Self: Sized` bound. Thus, while the associated type can be specified, it cannot be used in any way, because trait objects are not `Sized`.
+
+warning: unnecessary associated type bound for not object safe associated type
+ --> $DIR/assoc_type_bounds_sized_unnecessary.rs:9:20
+ |
+LL | fn foo(_: &dyn Foo<Bar = ()>) {}
+ | ^^^^^^^^ help: remove this bound
+ |
+ = note: this associated type has a `where Self: Sized` bound. Thus, while the associated type can be specified, it cannot be used in any way, because trait objects are not `Sized`.
+
+warning: 3 warnings emitted
+
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized_used.rs b/tests/ui/object-safety/assoc_type_bounds_sized_used.rs
new file mode 100644
index 000000000..cf5345b1c
--- /dev/null
+++ b/tests/ui/object-safety/assoc_type_bounds_sized_used.rs
@@ -0,0 +1,20 @@
+//! This test checks that even if some associated types have
+//! `where Self: Sized` bounds, those without still need to be
+//! mentioned in trait objects.
+
+trait Bop {
+ type Bar: Default
+ where
+ Self: Sized;
+}
+
+fn bop<T: Bop + ?Sized>() {
+ let _ = <T as Bop>::Bar::default();
+ //~^ ERROR: trait bounds were not satisfied
+ //~| ERROR: the size for values of type `T` cannot be known at compilation time
+}
+
+fn main() {
+ bop::<dyn Bop>();
+ //~^ ERROR: the size for values of type `dyn Bop` cannot be known at compilation time
+}
diff --git a/tests/ui/object-safety/assoc_type_bounds_sized_used.stderr b/tests/ui/object-safety/assoc_type_bounds_sized_used.stderr
new file mode 100644
index 000000000..f8488d842
--- /dev/null
+++ b/tests/ui/object-safety/assoc_type_bounds_sized_used.stderr
@@ -0,0 +1,53 @@
+error[E0599]: the function or associated item `default` exists for associated type `<T as Bop>::Bar`, but its trait bounds were not satisfied
+ --> $DIR/assoc_type_bounds_sized_used.rs:12:30
+ |
+LL | let _ = <T as Bop>::Bar::default();
+ | ^^^^^^^ function or associated item cannot be called on `<T as Bop>::Bar` due to unsatisfied trait bounds
+ |
+ = note: the following trait bounds were not satisfied:
+ `T: Sized`
+ which is required by `<T as Bop>::Bar: Default`
+help: consider restricting the type parameter to satisfy the trait bound
+ |
+LL | fn bop<T: Bop + ?Sized>() where T: Sized {
+ | ++++++++++++++
+
+error[E0277]: the size for values of type `T` cannot be known at compilation time
+ --> $DIR/assoc_type_bounds_sized_used.rs:12:13
+ |
+LL | fn bop<T: Bop + ?Sized>() {
+ | - this type parameter needs to be `Sized`
+LL | let _ = <T as Bop>::Bar::default();
+ | ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+note: required by a bound in `Bop::Bar`
+ --> $DIR/assoc_type_bounds_sized_used.rs:8:15
+ |
+LL | type Bar: Default
+ | --- required by a bound in this associated type
+LL | where
+LL | Self: Sized;
+ | ^^^^^ required by this bound in `Bop::Bar`
+help: consider removing the `?Sized` bound to make the type parameter `Sized`
+ |
+LL - fn bop<T: Bop + ?Sized>() {
+LL + fn bop<T: Bop>() {
+ |
+
+error[E0277]: the size for values of type `dyn Bop` cannot be known at compilation time
+ --> $DIR/assoc_type_bounds_sized_used.rs:18:11
+ |
+LL | bop::<dyn Bop>();
+ | ^^^^^^^ doesn't have a size known at compile-time
+ |
+ = help: the trait `Sized` is not implemented for `dyn Bop`
+note: required by a bound in `bop`
+ --> $DIR/assoc_type_bounds_sized_used.rs:11:11
+ |
+LL | fn bop<T: Bop + ?Sized>() {
+ | ^^^ required by this bound in `bop`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0277, E0599.
+For more information about an error, try `rustc --explain E0277`.