diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-10-21 13:59:35 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-21 13:59:35 +0900 |
| commit | 9583029a2d941bf8735a9af6fd38122ca1af6f0e (patch) | |
| tree | b185529070664a5ffa792d06a73b27046ca88018 /src/test | |
| parent | ff3c8cb5182ae5ffee4cd47dbabbe981f859c40f (diff) | |
| parent | 88f5e110db438d6e69a4493e21bd5a99cefdb46d (diff) | |
Rollup merge of #78002 - estebank:issue-77598, r=oli-obk
Tweak "object unsafe" errors CC #77598.
Diffstat (limited to 'src/test')
54 files changed, 613 insertions, 390 deletions
diff --git a/src/test/ui/associated-consts/associated-const-in-trait.stderr b/src/test/ui/associated-consts/associated-const-in-trait.stderr index a8a8d01ed78..7b459410824 100644 --- a/src/test/ui/associated-consts/associated-const-in-trait.stderr +++ b/src/test/ui/associated-consts/associated-const-in-trait.stderr @@ -1,15 +1,17 @@ error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/associated-const-in-trait.rs:9:6 | -LL | trait Trait { - | ----- this trait cannot be made into an object... -LL | const N: usize; - | - ...because it contains this associated `const` -... LL | impl dyn Trait { - | ^^^^^^^^^ the trait `Trait` cannot be made into an object + | ^^^^^^^^^ `Trait` cannot be made into an object | = help: consider moving `N` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/associated-const-in-trait.rs:6:11 + | +LL | trait Trait { + | ----- this trait cannot be made into an object... +LL | const N: usize; + | ^ ...because it contains this associated `const` error: aborting due to previous error diff --git a/src/test/ui/associated-item/issue-48027.stderr b/src/test/ui/associated-item/issue-48027.stderr index 98b545c6e0e..92d74e38cfa 100644 --- a/src/test/ui/associated-item/issue-48027.stderr +++ b/src/test/ui/associated-item/issue-48027.stderr @@ -1,15 +1,17 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/issue-48027.rs:6:6 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | const X: usize; - | - ...because it contains this associated `const` -... LL | impl dyn Bar {} - | ^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^^^^^ `Bar` cannot be made into an object | = help: consider moving `X` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-48027.rs:2:11 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | const X: usize; + | ^ ...because it contains this associated `const` error[E0283]: type annotations needed --> $DIR/issue-48027.rs:3:32 diff --git a/src/test/ui/coherence/coherence-impl-trait-for-trait-object-safe.stderr b/src/test/ui/coherence/coherence-impl-trait-for-trait-object-safe.stderr index cd18a013628..a2b779e2954 100644 --- a/src/test/ui/coherence/coherence-impl-trait-for-trait-object-safe.stderr +++ b/src/test/ui/coherence/coherence-impl-trait-for-trait-object-safe.stderr @@ -1,14 +1,17 @@ error[E0038]: the trait `NotObjectSafe` cannot be made into an object --> $DIR/coherence-impl-trait-for-trait-object-safe.rs:7:24 | -LL | trait NotObjectSafe { fn eq(&self, other: Self); } - | ------------- ---- ...because method `eq` references the `Self` type in this parameter - | | - | this trait cannot be made into an object... LL | impl NotObjectSafe for dyn NotObjectSafe { } - | ^^^^^^^^^^^^^^^^^ the trait `NotObjectSafe` cannot be made into an object + | ^^^^^^^^^^^^^^^^^ `NotObjectSafe` cannot be made into an object | = help: consider moving `eq` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/coherence-impl-trait-for-trait-object-safe.rs:6:43 + | +LL | trait NotObjectSafe { fn eq(&self, other: Self); } + | ------------- ^^^^ ...because method `eq` references the `Self` type in this parameter + | | + | this trait cannot be made into an object... error: aborting due to previous error diff --git a/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr b/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr index a8b160bbb2c..68734cd4ccd 100644 --- a/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr +++ b/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr @@ -14,9 +14,10 @@ error[E0038]: the trait `Copy` cannot be made into an object --> $DIR/trait-object-reference-without-parens-suggestion.rs:4:12 | LL | let _: &Copy + 'static; - | ^^^^^ the trait `Copy` cannot be made into an object + | ^^^^^ `Copy` cannot be made into an object | = note: the trait cannot be made into an object because it requires `Self: Sized` + = note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> error: aborting due to 3 previous errors diff --git a/src/test/ui/error-codes/E0033-teach.stderr b/src/test/ui/error-codes/E0033-teach.stderr index f323a990455..513fda3097c 100644 --- a/src/test/ui/error-codes/E0033-teach.stderr +++ b/src/test/ui/error-codes/E0033-teach.stderr @@ -7,15 +7,21 @@ LL | let trait_obj: &dyn SomeTrait = SomeTrait; error[E0038]: the trait `SomeTrait` cannot be made into an object --> $DIR/E0033-teach.rs:8:20 | +LL | let trait_obj: &dyn SomeTrait = SomeTrait; + | ^^^^^^^^^^^^^^ `SomeTrait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/E0033-teach.rs:4:8 + | LL | trait SomeTrait { | --------- this trait cannot be made into an object... LL | fn foo(); - | --- ...because associated function `foo` has no `self` parameter -... -LL | let trait_obj: &dyn SomeTrait = SomeTrait; - | ^^^^^^^^^^^^^^ the trait `SomeTrait` cannot be made into an object + | ^^^ ...because associated function `foo` has no `self` parameter +help: consider turning `foo` into a method by giving it a `&self` argument | -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn foo(&self); + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() where Self: Sized; | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/error-codes/E0033.stderr b/src/test/ui/error-codes/E0033.stderr index 84481ff16c0..fc1248440d0 100644 --- a/src/test/ui/error-codes/E0033.stderr +++ b/src/test/ui/error-codes/E0033.stderr @@ -7,15 +7,21 @@ LL | let trait_obj: &dyn SomeTrait = SomeTrait; error[E0038]: the trait `SomeTrait` cannot be made into an object --> $DIR/E0033.rs:6:20 | +LL | let trait_obj: &dyn SomeTrait = SomeTrait; + | ^^^^^^^^^^^^^^ `SomeTrait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/E0033.rs:2:8 + | LL | trait SomeTrait { | --------- this trait cannot be made into an object... LL | fn foo(); - | --- ...because associated function `foo` has no `self` parameter -... -LL | let trait_obj: &dyn SomeTrait = SomeTrait; - | ^^^^^^^^^^^^^^ the trait `SomeTrait` cannot be made into an object + | ^^^ ...because associated function `foo` has no `self` parameter +help: consider turning `foo` into a method by giving it a `&self` argument | -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn foo(&self); + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() where Self: Sized; | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/error-codes/E0038.stderr b/src/test/ui/error-codes/E0038.stderr index 638e924b0eb..eb68a6298d1 100644 --- a/src/test/ui/error-codes/E0038.stderr +++ b/src/test/ui/error-codes/E0038.stderr @@ -1,15 +1,17 @@ error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/E0038.rs:5:16 | -LL | trait Trait { - | ----- this trait cannot be made into an object... -LL | fn foo(&self) -> Self; - | ---- ...because method `foo` references the `Self` type in its return type -... LL | fn call_foo(x: Box<dyn Trait>) { - | ^^^^^^^^^^^^^^ the trait `Trait` cannot be made into an object + | ^^^^^^^^^^^^^^ `Trait` cannot be made into an object | = help: consider moving `foo` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/E0038.rs:2:22 + | +LL | trait Trait { + | ----- this trait cannot be made into an object... +LL | fn foo(&self) -> Self; + | ^^^^ ...because method `foo` references the `Self` type in its return type error: aborting due to previous error diff --git a/src/test/ui/feature-gates/feature-gate-object_safe_for_dispatch.stderr b/src/test/ui/feature-gates/feature-gate-object_safe_for_dispatch.stderr index e3272e8849f..b61d5604455 100644 --- a/src/test/ui/feature-gates/feature-gate-object_safe_for_dispatch.stderr +++ b/src/test/ui/feature-gates/feature-gate-object_safe_for_dispatch.stderr @@ -1,26 +1,35 @@ error[E0038]: the trait `NonObjectSafe1` cannot be made into an object --> $DIR/feature-gate-object_safe_for_dispatch.rs:18:38 | +LL | fn takes_non_object_safe_ref<T>(obj: &dyn NonObjectSafe1) { + | ^^^^^^^^^^^^^^^^^^^ `NonObjectSafe1` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/feature-gate-object_safe_for_dispatch.rs:4:23 + | LL | trait NonObjectSafe1: Sized {} - | -------------- ----- ...because it requires `Self: Sized` + | -------------- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | fn takes_non_object_safe_ref<T>(obj: &dyn NonObjectSafe1) { - | ^^^^^^^^^^^^^^^^^^^ the trait `NonObjectSafe1` cannot be made into an object error[E0038]: the trait `NonObjectSafe2` cannot be made into an object --> $DIR/feature-gate-object_safe_for_dispatch.rs:22:36 | +LL | fn return_non_object_safe_ref() -> &'static dyn NonObjectSafe2 { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `NonObjectSafe2` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/feature-gate-object_safe_for_dispatch.rs:7:8 + | LL | trait NonObjectSafe2 { | -------------- this trait cannot be made into an object... LL | fn static_fn() {} - | --------- ...because associated function `static_fn` has no `self` parameter -... -LL | fn return_non_object_safe_ref() -> &'static dyn NonObjectSafe2 { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `NonObjectSafe2` cannot be made into an object + | ^^^^^^^^^ ...because associated function `static_fn` has no `self` parameter +help: consider turning `static_fn` into a method by giving it a `&self` argument | -help: consider turning `static_fn` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn static_fn(&self) {} + | ^^^^^ +help: alternatively, consider constraining `static_fn` so it does not apply to trait objects | LL | fn static_fn() where Self: Sized {} | ^^^^^^^^^^^^^^^^^ @@ -28,39 +37,46 @@ LL | fn static_fn() where Self: Sized {} error[E0038]: the trait `NonObjectSafe3` cannot be made into an object --> $DIR/feature-gate-object_safe_for_dispatch.rs:27:35 | -LL | trait NonObjectSafe3 { - | -------------- this trait cannot be made into an object... -LL | fn foo<T>(&self); - | --- ...because method `foo` has generic type parameters -... LL | fn takes_non_object_safe_box(obj: Box<dyn NonObjectSafe3>) { - | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `NonObjectSafe3` cannot be made into an object + | ^^^^^^^^^^^^^^^^^^^^^^^ `NonObjectSafe3` cannot be made into an object | = help: consider moving `foo` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/feature-gate-object_safe_for_dispatch.rs:11:8 + | +LL | trait NonObjectSafe3 { + | -------------- this trait cannot be made into an object... +LL | fn foo<T>(&self); + | ^^^ ...because method `foo` has generic type parameters error[E0038]: the trait `NonObjectSafe4` cannot be made into an object --> $DIR/feature-gate-object_safe_for_dispatch.rs:31:35 | -LL | trait NonObjectSafe4 { - | -------------- this trait cannot be made into an object... -LL | fn foo(&self, &Self); - | ----- ...because method `foo` references the `Self` type in this parameter -... LL | fn return_non_object_safe_rc() -> std::rc::Rc<dyn NonObjectSafe4> { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `NonObjectSafe4` cannot be made into an object + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `NonObjectSafe4` cannot be made into an object | = help: consider moving `foo` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/feature-gate-object_safe_for_dispatch.rs:15:19 + | +LL | trait NonObjectSafe4 { + | -------------- this trait cannot be made into an object... +LL | fn foo(&self, &Self); + | ^^^^^ ...because method `foo` references the `Self` type in this parameter error[E0038]: the trait `NonObjectSafe1` cannot be made into an object --> $DIR/feature-gate-object_safe_for_dispatch.rs:38:16 | +LL | impl Trait for dyn NonObjectSafe1 {} + | ^^^^^^^^^^^^^^^^^^ `NonObjectSafe1` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/feature-gate-object_safe_for_dispatch.rs:4:23 + | LL | trait NonObjectSafe1: Sized {} - | -------------- ----- ...because it requires `Self: Sized` + | -------------- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | impl Trait for dyn NonObjectSafe1 {} - | ^^^^^^^^^^^^^^^^^^ the trait `NonObjectSafe1` cannot be made into an object error: aborting due to 5 previous errors diff --git a/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr index 9df5188bbdd..2f3726bdb33 100644 --- a/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr +++ b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr @@ -1,15 +1,21 @@ error[E0038]: the trait `NotObjectSafe` cannot be made into an object --> $DIR/object-unsafe-trait-in-return-position-dyn-trait.rs:21:13 | +LL | fn car() -> dyn NotObjectSafe { + | ^^^^^^^^^^^^^^^^^ `NotObjectSafe` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-unsafe-trait-in-return-position-dyn-trait.rs:3:8 + | LL | trait NotObjectSafe { | ------------- this trait cannot be made into an object... LL | fn foo() -> Self; - | --- ...because associated function `foo` has no `self` parameter -... -LL | fn car() -> dyn NotObjectSafe { - | ^^^^^^^^^^^^^^^^^ the trait `NotObjectSafe` cannot be made into an object + | ^^^ ...because associated function `foo` has no `self` parameter +help: consider turning `foo` into a method by giving it a `&self` argument | -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn foo(&self) -> Self; + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() -> Self where Self: Sized; | ^^^^^^^^^^^^^^^^^ @@ -17,15 +23,21 @@ LL | fn foo() -> Self where Self: Sized; error[E0038]: the trait `NotObjectSafe` cannot be made into an object --> $DIR/object-unsafe-trait-in-return-position-dyn-trait.rs:28:13 | +LL | fn cat() -> Box<dyn NotObjectSafe> { + | ^^^^^^^^^^^^^^^^^^^^^^ `NotObjectSafe` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-unsafe-trait-in-return-position-dyn-trait.rs:3:8 + | LL | trait NotObjectSafe { | ------------- this trait cannot be made into an object... LL | fn foo() -> Self; - | --- ...because associated function `foo` has no `self` parameter -... -LL | fn cat() -> Box<dyn NotObjectSafe> { - | ^^^^^^^^^^^^^^^^^^^^^^ the trait `NotObjectSafe` cannot be made into an object + | ^^^ ...because associated function `foo` has no `self` parameter +help: consider turning `foo` into a method by giving it a `&self` argument | -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn foo(&self) -> Self; + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() -> Self where Self: Sized; | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-18959.stderr b/src/test/ui/issues/issue-18959.stderr index b3ba7aecad0..86b530e85a8 100644 --- a/src/test/ui/issues/issue-18959.stderr +++ b/src/test/ui/issues/issue-18959.stderr @@ -1,15 +1,17 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/issue-18959.rs:11:11 | -LL | pub trait Foo { fn foo<T>(&self, ext_thing: &T); } - | --- ...because method `foo` has generic type parameters -LL | pub trait Bar: Foo { } - | --- this trait cannot be made into an object... -... LL | fn foo(b: &dyn Bar) { - | ^^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^^^^^^ `Bar` cannot be made into an object | = help: consider moving `foo` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-18959.rs:1:20 + | +LL | pub trait Foo { fn foo<T>(&self, ext_thing: &T); } + | ^^^ ...because method `foo` has generic type parameters +LL | pub trait Bar: Foo { } + | --- this trait cannot be made into an object... error: aborting due to previous error diff --git a/src/test/ui/issues/issue-19380.stderr b/src/test/ui/issues/issue-19380.stderr index 63f0701974b..c3a5d3dfeee 100644 --- a/src/test/ui/issues/issue-19380.stderr +++ b/src/test/ui/issues/issue-19380.stderr @@ -1,15 +1,21 @@ error[E0038]: the trait `Qiz` cannot be made into an object --> $DIR/issue-19380.rs:11:9 | +LL | foos: &'static [&'static (dyn Qiz + 'static)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Qiz` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-19380.rs:2:6 + | LL | trait Qiz { | --- this trait cannot be made into an object... LL | fn qiz(); - | --- ...because associated function `qiz` has no `self` parameter -... -LL | foos: &'static [&'static (dyn Qiz + 'static)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Qiz` cannot be made into an object + | ^^^ ...because associated function `qiz` has no `self` parameter +help: consider turning `qiz` into a method by giving it a `&self` argument | -help: consider turning `qiz` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn qiz(&self); + | ^^^^^ +help: alternatively, consider constraining `qiz` so it does not apply to trait objects | LL | fn qiz() where Self: Sized; | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-19538.stderr b/src/test/ui/issues/issue-19538.stderr index 71a013248cf..555d0ff0dc7 100644 --- a/src/test/ui/issues/issue-19538.stderr +++ b/src/test/ui/issues/issue-19538.stderr @@ -1,30 +1,34 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/issue-19538.rs:17:15 | +LL | let test: &mut dyn Bar = &mut thing; + | ^^^^^^^^^^^^ `Bar` cannot be made into an object + | + = help: consider moving `foo` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-19538.rs:2:8 + | LL | fn foo<T>(&self, val: T); - | --- ...because method `foo` has generic type parameters + | ^^^ ...because method `foo` has generic type parameters ... LL | trait Bar: Foo { } | --- this trait cannot be made into an object... -... -LL | let test: &mut dyn Bar = &mut thing; - | ^^^^^^^^^^^^ the trait `Bar` cannot be made into an object - | - = help: consider moving `foo` to another trait error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/issue-19538.rs:17:30 | +LL | let test: &mut dyn Bar = &mut thing; + | ^^^^^^^^^^ `Bar` cannot be made into an object + | + = help: consider moving `foo` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-19538.rs:2:8 + | LL | fn foo<T>(&self, val: T); - | --- ...because method `foo` has generic type parameters + | ^^^ ...because method `foo` has generic type parameters ... LL | trait Bar: Foo { } | --- this trait cannot be made into an object... -... -LL | let test: &mut dyn Bar = &mut thing; - | ^^^^^^^^^^ the trait `Bar` cannot be made into an object - | - = help: consider moving `foo` to another trait = note: required because of the requirements on the impl of `CoerceUnsized<&mut dyn Bar>` for `&mut Thing` = note: required by cast to type `&mut dyn Bar` diff --git a/src/test/ui/issues/issue-20692.stderr b/src/test/ui/issues/issue-20692.stderr index 0badf66ba7d..1d7f252e556 100644 --- a/src/test/ui/issues/issue-20692.stderr +++ b/src/test/ui/issues/issue-20692.stderr @@ -1,27 +1,32 @@ error[E0038]: the trait `Array` cannot be made into an object --> $DIR/issue-20692.rs:7:5 | +LL | &dyn Array; + | ^^^^^^^^^^ `Array` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-20692.rs:1:14 + | LL | trait Array: Sized + Copy {} - | ----- ----- ---- ...because it requires `Self: Sized` + | ----- ^^^^^ ^^^^ ...because it requires `Self: Sized` | | | | | ...because it requires `Self: Sized` | this trait cannot be made into an object... -... -LL | &dyn Array; - | ^^^^^^^^^^ the trait `Array` cannot be made into an object error[E0038]: the trait `Array` cannot be made into an object --> $DIR/issue-20692.rs:4:13 | +LL | let _ = x + | ^ `Array` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-20692.rs:1:14 + | LL | trait Array: Sized + Copy {} - | ----- ----- ---- ...because it requires `Self: Sized` + | ----- ^^^^^ ^^^^ ...because it requires `Self: Sized` | | | | | ...because it requires `Self: Sized` | this trait cannot be made into an object... -... -LL | let _ = x - | ^ the trait `Array` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Array>` for `&T` = note: required by cast to type `&dyn Array` diff --git a/src/test/ui/issues/issue-26056.stderr b/src/test/ui/issues/issue-26056.stderr index be438ef9ac7..2c873243fe9 100644 --- a/src/test/ui/issues/issue-26056.stderr +++ b/src/test/ui/issues/issue-26056.stderr @@ -1,13 +1,16 @@ error[E0038]: the trait `Map` cannot be made into an object --> $DIR/issue-26056.rs:20:13 | +LL | as &dyn Map<Key=u32,MapValue=u32>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Map` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-26056.rs:9:12 + | LL | trait Map: MapLookup<<Self as Map>::Key> { - | --- ----------------------------- ...because it uses `Self` as a type parameter in this + | --- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter | | | this trait cannot be made into an object... -... -LL | as &dyn Map<Key=u32,MapValue=u32>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Map` cannot be made into an object error: aborting due to previous error diff --git a/src/test/ui/issues/issue-28576.stderr b/src/test/ui/issues/issue-28576.stderr index 658199003c1..203cd0630eb 100644 --- a/src/test/ui/issues/issue-28576.stderr +++ b/src/test/ui/issues/issue-28576.stderr @@ -1,16 +1,19 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/issue-28576.rs:7:12 | -LL | pub trait Bar: Foo<Assoc=()> { - | --- ------------- - | | | | - | | | ...because it uses `Self` as a type parameter in this - | | ...because it uses `Self` as a type parameter in this - | this trait cannot be made into an object... -LL | fn new(&self, b: & LL | / dyn Bar LL | | <Assoc=()> - | |________________________^ the trait `Bar` cannot be made into an object + | |________________________^ `Bar` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-28576.rs:5:16 + | +LL | pub trait Bar: Foo<Assoc=()> { + | --- ^^^^^^^^^^^^^ + | | | | + | | | ...because it uses `Self` as a type parameter + | | ...because it uses `Self` as a type parameter + | this trait cannot be made into an object... error: aborting due to previous error diff --git a/src/test/ui/issues/issue-38404.stderr b/src/test/ui/issues/issue-38404.stderr index 50c5195dc93..d7721d7e69c 100644 --- a/src/test/ui/issues/issue-38404.stderr +++ b/src/test/ui/issues/issue-38404.stderr @@ -1,12 +1,16 @@ error[E0038]: the trait `B` cannot be made into an object --> $DIR/issue-38404.rs:3:15 | +LL | trait C<T>: A<dyn B<T, Output=usize>> {} + | ^^^^^^^^^^^^^^^^^^^^^^ `B` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-38404.rs:1:13 + | LL | trait A<T>: std::ops::Add<Self> + Sized {} - | ------------------- ...because it uses `Self` as a type parameter in this + | ^^^^^^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter LL | trait B<T>: A<T> {} | - this trait cannot be made into an object... -LL | trait C<T>: A<dyn B<T, Output=usize>> {} - | ^^^^^^^^^^^^^^^^^^^^^^ the trait `B` cannot be made into an object error: aborting due to previous error diff --git a/src/test/ui/issues/issue-38604.stderr b/src/test/ui/issues/issue-38604.stderr index 39a62b81c6c..d41488c15f7 100644 --- a/src/test/ui/issues/issue-38604.stderr +++ b/src/test/ui/issues/issue-38604.stderr @@ -1,25 +1,30 @@ error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/issue-38604.rs:14:13 | +LL | let _f: Box<dyn Foo> = + | ^^^^^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-38604.rs:2:22 + | LL | trait Foo where u32: Q<Self> { - | --- ------- ...because it uses `Self` as a type parameter in this + | --- ^^^^^^^ ...because it uses `Self` as a type parameter | | | this trait cannot be made into an object... -... -LL | let _f: Box<dyn Foo> = - | ^^^^^^^^^^^^ the trait `Foo` cannot be made into an object error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/issue-38604.rs:15:9 | +LL | Box::new(()); + | ^^^^^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-38604.rs:2:22 + | LL | trait Foo where u32: Q<Self> { - | --- ------- ...because it uses `Self` as a type parameter in this + | --- ^^^^^^^ ...because it uses `Self` as a type parameter | | | this trait cannot be made into an object... -... -LL | Box::new(()); - | ^^^^^^^^^^^^ the trait `Foo` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn Foo>>` for `Box<()>` = note: required by cast to type `Box<dyn Foo>` diff --git a/src/test/ui/issues/issue-50781.stderr b/src/test/ui/issues/issue-50781.stderr index 03e3a7f227a..93bd951d3fa 100644 --- a/src/test/ui/issues/issue-50781.stderr +++ b/src/test/ui/issues/issue-50781.stderr @@ -1,10 +1,8 @@ error: the trait `X` cannot be made into an object --> $DIR/issue-50781.rs:6:8 | -LL | trait X { - | - this trait cannot be made into an object... LL | fn foo(&self) where Self: Trait; - | ^^^ ...because method `foo` references the `Self` type in its `where` clause + | ^^^ | note: the lint level is defined here --> $DIR/issue-50781.rs:1:9 @@ -13,6 +11,13 @@ LL | #![deny(where_clauses_object_safety)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #51443 <https://github.com/rust-lang/rust/issues/51443> +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-50781.rs:6:8 + | +LL | trait X { + | - this trait cannot be made into an object... +LL | fn foo(&self) where Self: Trait; + | ^^^ ...because method `foo` references the `Self` type in its `where` clause = help: consider moving `foo` to another trait error: aborting due to previous error diff --git a/src/test/ui/kindck/kindck-inherited-copy-bound.curr.stderr b/src/test/ui/kindck/kindck-inherited-copy-bound.curr.stderr index a6fd44d1743..64e56f8c790 100644 --- a/src/test/ui/kindck/kindck-inherited-copy-bound.curr.stderr +++ b/src/test/ui/kindck/kindck-inherited-copy-bound.curr.stderr @@ -12,25 +12,30 @@ LL | take_param(&x); error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/kindck-inherited-copy-bound.rs:28:19 | +LL | let z = &x as &dyn Foo; + | ^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/kindck-inherited-copy-bound.rs:10:13 + | LL | trait Foo : Copy { - | --- ---- ...because it requires `Self: Sized` + | --- ^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | let z = &x as &dyn Foo; - | ^^^^^^^^ the trait `Foo` cannot be made into an object error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/kindck-inherited-copy-bound.rs:28:13 | +LL | let z = &x as &dyn Foo; + | ^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/kindck-inherited-copy-bound.rs:10:13 + | LL | trait Foo : Copy { - | --- ---- ...because it requires `Self: Sized` + | --- ^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | let z = &x as &dyn Foo; - | ^^ the trait `Foo` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Foo>` for `&Box<{integer}>` = note: required by cast to type `&dyn Foo` diff --git a/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr b/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr index bc7448a05e8..57f7551fd40 100644 --- a/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr +++ b/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr @@ -12,14 +12,16 @@ LL | take_param(&x); error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/kindck-inherited-copy-bound.rs:28:13 | +LL | let z = &x as &dyn Foo; + | ^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/kindck-inherited-copy-bound.rs:10:13 + | LL | trait Foo : Copy { - | --- ---- ...because it requires `Self: Sized` + | --- ^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | let z = &x as &dyn Foo; - | ^^ the trait `Foo` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Foo>` for `&Box<i32>` = note: required by cast to type `&dyn Foo` diff --git a/src/test/ui/object-safety/object-safety-associated-consts.curr.stderr b/src/test/ui/object-safety/object-safety-associated-consts.curr.stderr index 890acde35c4..35ec586892c 100644 --- a/src/test/ui/object-safety/object-safety-associated-consts.curr.stderr +++ b/src/test/ui/object-safety/object-safety-associated-consts.curr.stderr @@ -1,15 +1,17 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-associated-consts.rs:12:30 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | const X: usize; - | - ...because it contains this associated `const` -... LL | fn make_bar<T:Bar>(t: &T) -> &dyn Bar { - | ^^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^^^^^^ `Bar` cannot be made into an object | = help: consider moving `X` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-associated-consts.rs:9:11 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | const X: usize; + | ^ ...because it contains this associated `const` error: aborting due to previous error diff --git a/src/test/ui/object-safety/object-safety-associated-consts.object_safe_for_dispatch.stderr b/src/test/ui/object-safety/object-safety-associated-consts.object_safe_for_dispatch.stderr index c32038b5a27..d51734ed231 100644 --- a/src/test/ui/object-safety/object-safety-associated-consts.object_safe_for_dispatch.stderr +++ b/src/test/ui/object-safety/object-safety-associated-consts.object_safe_for_dispatch.stderr @@ -1,15 +1,17 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-associated-consts.rs:14:5 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | const X: usize; - | - ...because it contains this associated `const` -... LL | t - | ^ the trait `Bar` cannot be made into an object + | ^ `Bar` cannot be made into an object | = help: consider moving `X` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-associated-consts.rs:9:11 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | const X: usize; + | ^ ...because it contains this associated `const` = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Bar>` for `&T` = note: required by cast to type `&dyn Bar` diff --git a/src/test/ui/object-safety/object-safety-bounds.stderr b/src/test/ui/object-safety/object-safety-bounds.stderr index af454830863..89c4f8ced79 100644 --- a/src/test/ui/object-safety/object-safety-bounds.stderr +++ b/src/test/ui/object-safety/object-safety-bounds.stderr @@ -1,13 +1,16 @@ error[E0038]: the trait `X` cannot be made into an object --> $DIR/object-safety-bounds.rs:7:11 | +LL | fn f() -> Box<dyn X<U = u32>> { + | ^^^^^^^^^^^^^^^^^^^ `X` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-bounds.rs:4:13 + | LL | trait X { | - this trait cannot be made into an object... LL | type U: PartialEq<Self>; - | --------------- ...because it uses `Self` as a type parameter in this -... -LL | fn f() -> Box<dyn X<U = u32>> { - | ^^^^^^^^^^^^^^^^^^^ the trait `X` cannot be made into an object + | ^^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter error: aborting due to previous error diff --git a/src/test/ui/object-safety/object-safety-generics.curr.stderr b/src/test/ui/object-safety/object-safety-generics.curr.stderr index 9e70abbd32f..8d6094c5144 100644 --- a/src/test/ui/object-safety/object-safety-generics.curr.stderr +++ b/src/test/ui/object-safety/object-safety-generics.curr.stderr @@ -1,28 +1,32 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-generics.rs:18:30 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | fn bar<T>(&self, t: T); - | --- ...because method `bar` has generic type parameters -... LL | fn make_bar<T:Bar>(t: &T) -> &dyn Bar { - | ^^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^^^^^^ `Bar` cannot be made into an object | = help: consider moving `bar` to another trait - -error[E0038]: the trait `Bar` cannot be made into an object - --> $DIR/object-safety-generics.rs:24:39 +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-generics.rs:10:8 | LL | trait Bar { | --- this trait cannot be made into an object... LL | fn bar<T>(&self, t: T); - | --- ...because method `bar` has generic type parameters -... + | ^^^ ...because method `bar` has generic type parameters + +error[E0038]: the trait `Bar` cannot be made into an object + --> $DIR/object-safety-generics.rs:24:39 + | LL | fn make_bar_explicit<T:Bar>(t: &T) -> &dyn Bar { - | ^^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^^^^^^ `Bar` cannot be made into an object | = help: consider moving `bar` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-generics.rs:10:8 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | fn bar<T>(&self, t: T); + | ^^^ ...because method `bar` has generic type parameters error: aborting due to 2 previous errors diff --git a/src/test/ui/object-safety/object-safety-generics.object_safe_for_dispatch.stderr b/src/test/ui/object-safety/object-safety-generics.object_safe_for_dispatch.stderr index 7c104fa158d..3d2b2bb228c 100644 --- a/src/test/ui/object-safety/object-safety-generics.object_safe_for_dispatch.stderr +++ b/src/test/ui/object-safety/object-safety-generics.object_safe_for_dispatch.stderr @@ -1,30 +1,34 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-generics.rs:20:5 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | fn bar<T>(&self, t: T); - | --- ...because method `bar` has generic type parameters -... LL | t - | ^ the trait `Bar` cannot be made into an object + | ^ `Bar` cannot be made into an object | = help: consider moving `bar` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-generics.rs:10:8 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | fn bar<T>(&self, t: T); + | ^^^ ...because method `bar` has generic type parameters = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Bar>` for `&T` = note: required by cast to type `&dyn Bar` error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-generics.rs:26:5 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | fn bar<T>(&self, t: T); - | --- ...because method `bar` has generic type parameters -... LL | t as &dyn Bar - | ^ the trait `Bar` cannot be made into an object + | ^ `Bar` cannot be made into an object | = help: consider moving `bar` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-generics.rs:10:8 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | fn bar<T>(&self, t: T); + | ^^^ ...because method `bar` has generic type parameters = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Bar>` for `&T` = note: required by cast to type `&dyn Bar` diff --git a/src/test/ui/object-safety/object-safety-issue-22040.stderr b/src/test/ui/object-safety/object-safety-issue-22040.stderr index fe9ca5b6fa4..0262d536246 100644 --- a/src/test/ui/object-safety/object-safety-issue-22040.stderr +++ b/src/test/ui/object-safety/object-safety-issue-22040.stderr @@ -1,13 +1,16 @@ error[E0038]: the trait `Expr` cannot be made into an object --> $DIR/object-safety-issue-22040.rs:12:23 | +LL | elements: Vec<Box<dyn Expr + 'x>>, + | ^^^^^^^^^^^^^ `Expr` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-issue-22040.rs:5:21 + | LL | trait Expr: Debug + PartialEq { - | ---- --------- ...because it uses `Self` as a type parameter in this + | ---- ^^^^^^^^^ ...because it uses `Self` as a type parameter | | | this trait cannot be made into an object... -... -LL | elements: Vec<Box<dyn Expr + 'x>>, - | ^^^^^^^^^^^^^ the trait `Expr` cannot be made into an object error: aborting due to previous error diff --git a/src/test/ui/object-safety/object-safety-mentions-Self.curr.stderr b/src/test/ui/object-safety/object-safety-mentions-Self.curr.stderr index 4dbb27b425b..336929702e6 100644 --- a/src/test/ui/object-safety/object-safety-mentions-Self.curr.stderr +++ b/src/test/ui/object-safety/object-safety-mentions-Self.curr.stderr @@ -1,28 +1,32 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-mentions-Self.rs:22:30 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | fn bar(&self, x: &Self); - | ----- ...because method `bar` references the `Self` type in this parameter -... LL | fn make_bar<T:Bar>(t: &T) -> &dyn Bar { - | ^^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^^^^^^ `Bar` cannot be made into an object | = help: consider moving `bar` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-mentions-Self.rs:11:22 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | fn bar(&self, x: &Self); + | ^^^^^ ...because method `bar` references the `Self` type in this parameter error[E0038]: the trait `Baz` cannot be made into an object --> $DIR/object-safety-mentions-Self.rs:28:30 | -LL | trait Baz { - | --- this trait cannot be made into an object... -LL | fn baz(&self) -> Self; - | ---- ...because method `baz` references the `Self` type in its return type -... LL | fn make_baz<T:Baz>(t: &T) -> &dyn Baz { - | ^^^^^^^^ the trait `Baz` cannot be made into an object + | ^^^^^^^^ `Baz` cannot be made into an object | = help: consider moving `baz` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-mentions-Self.rs:15:22 + | +LL | trait Baz { + | --- this trait cannot be made into an object... +LL | fn baz(&self) -> Self; + | ^^^^ ...because method `baz` references the `Self` type in its return type error: aborting due to 2 previous errors diff --git a/src/test/ui/object-safety/object-safety-mentions-Self.object_safe_for_dispatch.stderr b/src/test/ui/object-safety/object-safety-mentions-Self.object_safe_for_dispatch.stderr index ced26889ba0..6e7896e309c 100644 --- a/src/test/ui/object-safety/object-safety-mentions-Self.object_safe_for_dispatch.stderr +++ b/src/test/ui/object-safety/object-safety-mentions-Self.object_safe_for_dispatch.stderr @@ -1,30 +1,34 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-mentions-Self.rs:24:5 | -LL | trait Bar { - | --- this trait cannot be made into an object... -LL | fn bar(&self, x: &Self); - | ----- ...because method `bar` references the `Self` type in this parameter -... LL | t - | ^ the trait `Bar` cannot be made into an object + | ^ `Bar` cannot be made into an object | = help: consider moving `bar` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-mentions-Self.rs:11:22 + | +LL | trait Bar { + | --- this trait cannot be made into an object... +LL | fn bar(&self, x: &Self); + | ^^^^^ ...because method `bar` references the `Self` type in this parameter = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Bar>` for `&T` = note: required by cast to type `&dyn Bar` error[E0038]: the trait `Baz` cannot be made into an object --> $DIR/object-safety-mentions-Self.rs:30:5 | -LL | trait Baz { - | --- this trait cannot be made into an object... -LL | fn baz(&self) -> Self; - | ---- ...because method `baz` references the `Self` type in its return type -... LL | t - | ^ the trait `Baz` cannot be made into an object + | ^ `Baz` cannot be made into an object | = help: consider moving `baz` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-mentions-Self.rs:15:22 + | +LL | trait Baz { + | --- this trait cannot be made into an object... +LL | fn baz(&self) -> Self; + | ^^^^ ...because method `baz` references the `Self` type in its return type = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Baz>` for `&T` = note: required by cast to type `&dyn Baz` diff --git a/src/test/ui/object-safety/object-safety-no-static.curr.stderr b/src/test/ui/object-safety/object-safety-no-static.curr.stderr index f878cf8b462..e00d6bb2f4a 100644 --- a/src/test/ui/object-safety/object-safety-no-static.curr.stderr +++ b/src/test/ui/object-safety/object-safety-no-static.curr.stderr @@ -1,15 +1,21 @@ error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/object-safety-no-static.rs:12:18 | +LL | fn diverges() -> Box<dyn Foo> { + | ^^^^^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-no-static.rs:9:8 + | LL | trait Foo { | --- this trait cannot be made into an object... LL | fn foo() {} - | --- ...because associated function `foo` has no `self` parameter -... -LL | fn diverges() -> Box<dyn Foo> { - | ^^^^^^^^^^^^ the trait `Foo` cannot be made into an object + | ^^^ ...because associated function `foo` has no `self` parameter +help: consider turning `foo` into a method by giving it a `&self` argument | -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn foo(&self) {} + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() where Self: Sized {} | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/object-safety/object-safety-no-static.object_safe_for_dispatch.stderr b/src/test/ui/object-safety/object-safety-no-static.object_safe_for_dispatch.stderr index 8e920697d8f..91a071f5678 100644 --- a/src/test/ui/object-safety/object-safety-no-static.object_safe_for_dispatch.stderr +++ b/src/test/ui/object-safety/object-safety-no-static.object_safe_for_dispatch.stderr @@ -1,17 +1,23 @@ error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/object-safety-no-static.rs:22:27 | +LL | let b: Box<dyn Foo> = Box::new(Bar); + | ^^^^^^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-no-static.rs:9:8 + | LL | trait Foo { | --- this trait cannot be made into an object... LL | fn foo() {} - | --- ...because associated function `foo` has no `self` parameter -... -LL | let b: Box<dyn Foo> = Box::new(Bar); - | ^^^^^^^^^^^^^ the trait `Foo` cannot be made into an object - | + | ^^^ ...because associated function `foo` has no `self` parameter = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn Foo>>` for `Box<Bar>` = note: required by cast to type `Box<dyn Foo>` -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +help: consider turning `foo` into a method by giving it a `&self` argument + | +LL | fn foo(&self) {} + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() where Self: Sized {} | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/object-safety/object-safety-sized-2.curr.stderr b/src/test/ui/object-safety/object-safety-sized-2.curr.stderr index 2f605d8e904..71236c8e384 100644 --- a/src/test/ui/object-safety/object-safety-sized-2.curr.stderr +++ b/src/test/ui/object-safety/object-safety-sized-2.curr.stderr @@ -1,13 +1,16 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-sized-2.rs:14:30 | +LL | fn make_bar<T:Bar>(t: &T) -> &dyn Bar { + | ^^^^^^^^ `Bar` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-sized-2.rs:9:18 + | LL | trait Bar | --- this trait cannot be made into an object... LL | where Self : Sized - | ----- ...because it requires `Self: Sized` -... -LL | fn make_bar<T:Bar>(t: &T) -> &dyn Bar { - | ^^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^^^ ...because it requires `Self: Sized` error: aborting due to previous error diff --git a/src/test/ui/object-safety/object-safety-sized-2.object_safe_for_dispatch.stderr b/src/test/ui/object-safety/object-safety-sized-2.object_safe_for_dispatch.stderr index cc0463f5d87..b6e4903b079 100644 --- a/src/test/ui/object-safety/object-safety-sized-2.object_safe_for_dispatch.stderr +++ b/src/test/ui/object-safety/object-safety-sized-2.object_safe_for_dispatch.stderr @@ -1,14 +1,16 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-sized-2.rs:16:5 | +LL | t + | ^ `Bar` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-sized-2.rs:9:18 + | LL | trait Bar | --- this trait cannot be made into an object... LL | where Self : Sized - | ----- ...because it requires `Self: Sized` -... -LL | t - | ^ the trait `Bar` cannot be made into an object - | + | ^^^^^ ...because it requires `Self: Sized` = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Bar>` for `&T` = note: required by cast to type `&dyn Bar` diff --git a/src/test/ui/object-safety/object-safety-sized.curr.stderr b/src/test/ui/object-safety/object-safety-sized.curr.stderr index 54f65c43d9c..94b06ee934d 100644 --- a/src/test/ui/object-safety/object-safety-sized.curr.stderr +++ b/src/test/ui/object-safety/object-safety-sized.curr.stderr @@ -1,13 +1,16 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-sized.rs:12:30 | +LL | fn make_bar<T:Bar>(t: &T) -> &dyn Bar { + | ^^^^^^^^ `Bar` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-sized.rs:8:13 + | LL | trait Bar : Sized { - | --- ----- ...because it requires `Self: Sized` + | --- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | fn make_bar<T:Bar>(t: &T) -> &dyn Bar { - | ^^^^^^^^ the trait `Bar` cannot be made into an object error: aborting due to previous error diff --git a/src/test/ui/object-safety/object-safety-sized.object_safe_for_dispatch.stderr b/src/test/ui/object-safety/object-safety-sized.object_safe_for_dispatch.stderr index aceacac2db3..645852c7e71 100644 --- a/src/test/ui/object-safety/object-safety-sized.object_safe_for_dispatch.stderr +++ b/src/test/ui/object-safety/object-safety-sized.object_safe_for_dispatch.stderr @@ -1,14 +1,16 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/object-safety-sized.rs:14:5 | +LL | t + | ^ `Bar` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-sized.rs:8:13 + | LL | trait Bar : Sized { - | --- ----- ...because it requires `Self: Sized` + | --- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | t - | ^ the trait `Bar` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Bar>` for `&T` = note: required by cast to type `&dyn Bar` diff --git a/src/test/ui/object-safety/object-safety-supertrait-mentions-Self.stderr b/src/test/ui/object-safety/object-safety-supertrait-mentions-Self.stderr index ef7f6bacd12..a106ab995b0 100644 --- a/src/test/ui/object-safety/object-safety-supertrait-mentions-Self.stderr +++ b/src/test/ui/object-safety/object-safety-supertrait-mentions-Self.stderr @@ -1,13 +1,16 @@ error[E0038]: the trait `Baz` cannot be made into an object --> $DIR/object-safety-supertrait-mentions-Self.rs:15:31 | +LL | fn make_baz<T:Baz>(t: &T) -> &dyn Baz { + | ^^^^^^^ `Baz` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-safety-supertrait-mentions-Self.rs:8:13 + | LL | trait Baz : Bar<Self> { - | --- --------- ...because it uses `Self` as a type parameter in this + | --- ^^^^^^^^^ ...because it uses `Self` as a type parameter | | | this trait cannot be made into an object... -... -LL | fn make_baz<T:Baz>(t: &T) -> &dyn Baz { - | ^^^^^^^ the trait `Baz` cannot be made into an object error: aborting due to previous error diff --git a/src/test/ui/resolve/issue-3907-2.stderr b/src/test/ui/resolve/issue-3907-2.stderr index bd6e9d59502..782cfeec4bc 100644 --- a/src/test/ui/resolve/issue-3907-2.stderr +++ b/src/test/ui/resolve/issue-3907-2.stderr @@ -2,12 +2,13 @@ error[E0038]: the trait `issue_3907::Foo` cannot be made into an object --> $DIR/issue-3907-2.rs:11:12 | LL | fn bar(_x: Foo) {} - | ^^^ the trait `issue_3907::Foo` cannot be made into an object - | - ::: $DIR/auxiliary/issue-3907.rs:2:8 + | ^^^ `issue_3907::Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/auxiliary/issue-3907.rs:2:8 | LL | fn bar(); - | --- the trait cannot be made into an object because associated function `bar` has no `self` parameter + | ^^^ the trait cannot be made into an object because associated function `bar` has no `self` parameter error: aborting due to previous error diff --git a/src/test/ui/self/arbitrary-self-types-not-object-safe.curr.stderr b/src/test/ui/self/arbitrary-self-types-not-object-safe.curr.stderr index 85da2c6eeb0..35a65facb57 100644 --- a/src/test/ui/self/arbitrary-self-types-not-object-safe.curr.stderr +++ b/src/test/ui/self/arbitrary-self-types-not-object-safe.curr.stderr @@ -1,31 +1,36 @@ error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/arbitrary-self-types-not-object-safe.rs:33:32 | -LL | trait Foo { - | --- this trait cannot be made into an object... LL | fn foo(self: &Rc<Self>) -> usize; - | --------- - | | - | ...because method `foo`'s `self` parameter cannot be dispatched on - | help: consider changing method `foo`'s `self` parameter to be `&self`: `&Self` + | --------- help: consider changing method `foo`'s `self` parameter to be `&self`: `&Self` ... LL | let x = Rc::new(5usize) as Rc<dyn Foo>; - | ^^^^^^^^^^^ the trait `Foo` cannot be made into an object + | ^^^^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/arbitrary-self-types-not-object-safe.rs:8:18 + | +LL | trait Foo { + | --- this trait cannot be made into an object... +LL | fn foo(self: &Rc<Self>) -> usize; + | ^^^^^^^^^ ...because method `foo`'s `self` parameter cannot be dispatched on error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/arbitrary-self-types-not-object-safe.rs:33:13 | -LL | trait Foo { - | --- this trait cannot be made into an object... LL | fn foo(self: &Rc<Self>) -> usize; - | --------- - | | - | ...because method `foo`'s `self` parameter cannot be dispatched on - | help: consider changing method `foo`'s `self` parameter to be `&self`: `&Self` + | --------- help: consider changing method `foo`'s `self` parameter to be `&self`: `&Self` ... LL | let x = Rc::new(5usize) as Rc<dyn Foo>; - | ^^^^^^^^^^^^^^^ the trait `Foo` cannot be made into an object + | ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/arbitrary-self-types-not-object-safe.rs:8:18 | +LL | trait Foo { + | --- this trait cannot be made into an object... +LL | fn foo(self: &Rc<Self>) -> usize; + | ^^^^^^^^^ ...because method `foo`'s `self` parameter cannot be dispatched on = note: required because of the requirements on the impl of `CoerceUnsized<Rc<dyn Foo>>` for `Rc<usize>` = note: required by cast to type `Rc<dyn Foo>` diff --git a/src/test/ui/self/arbitrary-self-types-not-object-safe.object_safe_for_dispatch.stderr b/src/test/ui/self/arbitrary-self-types-not-object-safe.object_safe_for_dispatch.stderr index c4cde2c3561..a74752cf840 100644 --- a/src/test/ui/self/arbitrary-self-types-not-object-safe.object_safe_for_dispatch.stderr +++ b/src/test/ui/self/arbitrary-self-types-not-object-safe.object_safe_for_dispatch.stderr @@ -1,17 +1,19 @@ error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/arbitrary-self-types-not-object-safe.rs:33:13 | -LL | trait Foo { - | --- this trait cannot be made into an object... LL | fn foo(self: &Rc<Self>) -> usize; - | --------- - | | - | ...because method `foo`'s `self` parameter cannot be dispatched on - | help: consider changing method `foo`'s `self` parameter to be `&self`: `&Self` + | --------- help: consider changing method `foo`'s `self` parameter to be `&self`: `&Self` ... LL | let x = Rc::new(5usize) as Rc<dyn Foo>; - | ^^^^^^^^^^^^^^^ the trait `Foo` cannot be made into an object + | ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/arbitrary-self-types-not-object-safe.rs:8:18 | +LL | trait Foo { + | --- this trait cannot be made into an object... +LL | fn foo(self: &Rc<Self>) -> usize; + | ^^^^^^^^^ ...because method `foo`'s `self` parameter cannot be dispatched on = note: required because of the requirements on the impl of `CoerceUnsized<Rc<dyn Foo>>` for `Rc<usize>` = note: required by cast to type `Rc<dyn Foo>` diff --git a/src/test/ui/suggestions/object-unsafe-trait-references-self.stderr b/src/test/ui/suggestions/object-unsafe-trait-references-self.stderr index c3cfad70bf4..797406f869f 100644 --- a/src/test/ui/suggestions/object-unsafe-trait-references-self.stderr +++ b/src/test/ui/suggestions/object-unsafe-trait-references-self.stderr @@ -1,29 +1,34 @@ error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/object-unsafe-trait-references-self.rs:6:11 | -LL | trait Trait { - | ----- this trait cannot be made into an object... -LL | fn baz(&self, _: Self) {} - | ---- ...because method `baz` references the `Self` type in this parameter -LL | fn bat(&self) -> Self {} - | ---- ...because method `bat` references the `Self` type in its return type -... LL | fn bar(x: &dyn Trait) {} - | ^^^^^^^^^^ the trait `Trait` cannot be made into an object + | ^^^^^^^^^^ `Trait` cannot be made into an object | = help: consider moving `baz` to another trait = help: consider moving `bat` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-unsafe-trait-references-self.rs:2:22 + | +LL | trait Trait { + | ----- this trait cannot be made into an object... +LL | fn baz(&self, _: Self) {} + | ^^^^ ...because method `baz` references the `Self` type in this parameter +LL | fn bat(&self) -> Self {} + | ^^^^ ...because method `bat` references the `Self` type in its return type error[E0038]: the trait `Other` cannot be made into an object --> $DIR/object-unsafe-trait-references-self.rs:10:11 | +LL | fn foo(x: &dyn Other) {} + | ^^^^^^^^^^ `Other` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-unsafe-trait-references-self.rs:8:14 + | LL | trait Other: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -LL | -LL | fn foo(x: &dyn Other) {} - | ^^^^^^^^^^ the trait `Other` cannot be made into an object error: aborting due to 2 previous errors diff --git a/src/test/ui/suggestions/object-unsafe-trait-should-use-self.stderr b/src/test/ui/suggestions/object-unsafe-trait-should-use-self.stderr index 58be59602b9..67491b0446f 100644 --- a/src/test/ui/suggestions/object-unsafe-trait-should-use-self.stderr +++ b/src/test/ui/suggestions/object-unsafe-trait-should-use-self.stderr @@ -14,12 +14,16 @@ LL | fn f(a: Self) -> Self; error[E0038]: the trait `A` cannot be made into an object --> $DIR/object-unsafe-trait-should-use-self.rs:3:13 | +LL | fn f(a: A) -> A; + | ^ `A` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-unsafe-trait-should-use-self.rs:2:10 + | LL | trait A: Sized { - | - ----- ...because it requires `Self: Sized` + | - ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -LL | fn f(a: A) -> A; - | ^ the trait `A` cannot be made into an object error: associated item referring to unboxed trait object for its own trait --> $DIR/object-unsafe-trait-should-use-self.rs:8:13 @@ -37,14 +41,21 @@ LL | fn f(a: Self) -> Self; error[E0038]: the trait `B` cannot be made into an object --> $DIR/object-unsafe-trait-should-use-self.rs:8:13 | +LL | fn f(a: B) -> B; + | ^ `B` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-unsafe-trait-should-use-self.rs:8:8 + | LL | trait B { | - this trait cannot be made into an object... LL | fn f(a: B) -> B; - | - ^ the trait `B` cannot be made into an object - | | - | ...because associated function `f` has no `self` parameter + | ^ ...because associated function `f` has no `self` parameter +help: consider turning `f` into a method by giving it a `&self` argument | -help: consider turning `f` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn f(&self, a: B) -> B; + | ^^^^^^ +help: alternatively, consider constraining `f` so it does not apply to trait objects | LL | fn f(a: B) -> B where Self: Sized; | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.fixed b/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.fixed index c4b8960b65e..73bb6725f5a 100644 --- a/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.fixed +++ b/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.fixed @@ -2,7 +2,7 @@ #![allow(unused_variables, dead_code)] trait Trait { - fn foo() where Self: Other, Self: Sized, { } + fn foo(&self) where Self: Other, Self: Sized, { } fn bar(self: &Self) {} //~ ERROR invalid `self` parameter type } diff --git a/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.stderr b/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.stderr index 6466a768ecb..a2caf846cc5 100644 --- a/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.stderr +++ b/src/test/ui/suggestions/object-unsafe-trait-should-use-where-sized.stderr @@ -1,17 +1,23 @@ error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/object-unsafe-trait-should-use-where-sized.rs:9:11 | +LL | fn bar(x: &dyn Trait) {} + | ^^^^^^^^^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/object-unsafe-trait-should-use-where-sized.rs:5:8 + | LL | trait Trait { | ----- this trait cannot be made into an object... LL | fn foo() where Self: Other, { } - | --- ...because associated function `foo` has no `self` parameter + | ^^^ ...because associated function `foo` has no `self` parameter LL | fn bar(self: ()) {} - | -- ...because method `bar`'s `self` parameter cannot be dispatched on -... -LL | fn bar(x: &dyn Trait) {} - | ^^^^^^^^^^ the trait `Trait` cannot be made into an object + | ^^ ...because method `bar`'s `self` parameter cannot be dispatched on +help: consider turning `foo` into a method by giving it a `&self` argument | -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn foo(&self) where Self: Other, { } + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() where Self: Other, Self: Sized, { } | ^^^^^^^^^^^^^ diff --git a/src/test/ui/traits/issue-72410.stderr b/src/test/ui/traits/issue-72410.stderr index 1db2320841f..c91d1db4d76 100644 --- a/src/test/ui/traits/issue-72410.stderr +++ b/src/test/ui/traits/issue-72410.stderr @@ -1,14 +1,21 @@ error[E0038]: the trait `Bar` cannot be made into an object --> $DIR/issue-72410.rs:14:19 | +LL | where for<'a> &'a mut [dyn Bar]: ; + | ^^^^^^^^^^^^^^^^^ `Bar` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/issue-72410.rs:13:8 + | LL | pub trait Bar { | --- this trait cannot be made into an object... LL | fn map() - | --- ...because associated function `map` has no `self` parameter -LL | where for<'a> &'a mut [dyn Bar]: ; - | ^^^^^^^^^^^^^^^^^ the trait `Bar` cannot be made into an object + | ^^^ ...because associated function `map` has no `self` parameter +help: consider turning `map` into a method by giving it a `&self` argument | -help: consider turning `map` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn map(&self) + | ^^^^^ +help: alternatively, consider constraining `map` so it does not apply to trait objects | LL | where for<'a> &'a mut [dyn Bar]:, Self: Sized ; | ^^^^^^^^^^^^^ diff --git a/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr b/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr index 1f54e03ee6e..1118a75e085 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr +++ b/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr @@ -2,12 +2,13 @@ error[E0038]: the trait `Eq` cannot be made into an object --> $DIR/trait-alias-object-fail.rs:7:13 | LL | let _: &dyn EqAlias = &123; - | ^^^^^^^^^^^ the trait `Eq` cannot be made into an object - | - ::: $SRC_DIR/core/src/cmp.rs:LL:COL + | ^^^^^^^^^^^ `Eq` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $SRC_DIR/core/src/cmp.rs:LL:COL | LL | pub trait Eq: PartialEq<Self> { - | --------------- the trait cannot be made into an object because it uses `Self` as a type parameter in this + | ^^^^^^^^^^^^^^^ the trait cannot be made into an object because it uses `Self` as a type parameter error[E0191]: the value of the associated type `Item` (from trait `Iterator`) must be specified --> $DIR/trait-alias-object-fail.rs:9:17 diff --git a/src/test/ui/traits/trait-item-privacy.stderr b/src/test/ui/traits/trait-item-privacy.stderr index 3be4f110973..4d97d934376 100644 --- a/src/test/ui/traits/trait-item-privacy.stderr +++ b/src/test/ui/traits/trait-item-privacy.stderr @@ -112,23 +112,25 @@ LL | C::A; error[E0038]: the trait `assoc_const::C` cannot be made into an object --> $DIR/trait-item-privacy.rs:101:5 | +LL | C::A; + | ^^^^ `assoc_const::C` cannot be made into an object + | + = help: consider moving `C` to another trait + = help: consider moving `B` to another trait + = help: consider moving `A` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/trait-item-privacy.rs:25:15 + | LL | const A: u8 = 0; - | - ...because it contains this associated `const` + | ^ ...because it contains this associated `const` ... LL | const B: u8 = 0; - | - ...because it contains this associated `const` + | ^ ...because it contains this associated `const` ... LL | pub trait C: A + B { | - this trait cannot be made into an object... LL | const C: u8 = 0; - | - ...because it contains this associated `const` -... -LL | C::A; - | ^^^^ the trait `assoc_const::C` cannot be made into an object - | - = help: consider moving `C` to another trait - = help: consider moving `B` to another trait - = help: consider moving `A` to another trait + | ^ ...because it contains this associated `const` error[E0223]: ambiguous associated type --> $DIR/trait-item-privacy.rs:115:12 diff --git a/src/test/ui/traits/trait-object-macro-matcher.stderr b/src/test/ui/traits/trait-object-macro-matcher.stderr index bc567360734..335eeb8f151 100644 --- a/src/test/ui/traits/trait-object-macro-matcher.stderr +++ b/src/test/ui/traits/trait-object-macro-matcher.stderr @@ -8,9 +8,10 @@ error[E0038]: the trait `Copy` cannot be made into an object --> $DIR/trait-object-macro-matcher.rs:8:8 | LL | m!(dyn Copy + Send + 'static); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` cannot be made into an object + | ^^^^^^^^^^^^^^^^^^^^^^^^^ `Copy` cannot be made into an object | = note: the trait cannot be made into an object because it requires `Self: Sized` + = note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> error: aborting due to 2 previous errors diff --git a/src/test/ui/traits/trait-object-safety.stderr b/src/test/ui/traits/trait-object-safety.stderr index 3fa7c0c484e..16f60962cc1 100644 --- a/src/test/ui/traits/trait-object-safety.stderr +++ b/src/test/ui/traits/trait-object-safety.stderr @@ -1,17 +1,23 @@ error[E0038]: the trait `Tr` cannot be made into an object --> $DIR/trait-object-safety.rs:15:22 | +LL | let _: &dyn Tr = &St; + | ^^^ `Tr` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/trait-object-safety.rs:4:8 + | LL | trait Tr { | -- this trait cannot be made into an object... LL | fn foo(); - | --- ...because associated function `foo` has no `self` parameter -... -LL | let _: &dyn Tr = &St; - | ^^^ the trait `Tr` cannot be made into an object - | + | ^^^ ...because associated function `foo` has no `self` parameter = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Tr>` for `&St` = note: required by cast to type `&dyn Tr` -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +help: consider turning `foo` into a method by giving it a `&self` argument + | +LL | fn foo(&self); + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() where Self: Sized; | ^^^^^^^^^^^^^^^^^ @@ -19,15 +25,21 @@ LL | fn foo() where Self: Sized; error[E0038]: the trait `Tr` cannot be made into an object --> $DIR/trait-object-safety.rs:15:12 | +LL | let _: &dyn Tr = &St; + | ^^^^^^^ `Tr` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/trait-object-safety.rs:4:8 + | LL | trait Tr { | -- this trait cannot be made into an object... LL | fn foo(); - | --- ...because associated function `foo` has no `self` parameter -... -LL | let _: &dyn Tr = &St; - | ^^^^^^^ the trait `Tr` cannot be made into an object + | ^^^ ...because associated function `foo` has no `self` parameter +help: consider turning `foo` into a method by giving it a `&self` argument | -help: consider turning `foo` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects +LL | fn foo(&self); + | ^^^^^ +help: alternatively, consider constraining `foo` so it does not apply to trait objects | LL | fn foo() where Self: Sized; | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/traits/trait-test-2.stderr b/src/test/ui/traits/trait-test-2.stderr index 0a62f1aeb27..a06f6a49194 100644 --- a/src/test/ui/traits/trait-test-2.stderr +++ b/src/test/ui/traits/trait-test-2.stderr @@ -13,32 +13,36 @@ LL | 10.blah::<i32, i32>(); error[E0038]: the trait `bar` cannot be made into an object --> $DIR/trait-test-2.rs:11:16 | -LL | trait bar { fn dup(&self) -> Self; fn blah<X>(&self); } - | --- ---- ---- ...because method `blah` has generic type parameters - | | | - | | ...because method `dup` references the `Self` type in its return type - | this trait cannot be made into an object... -... LL | (box 10 as Box<dyn bar>).dup(); - | ^^^^^^^^^^^^ the trait `bar` cannot be made into an object + | ^^^^^^^^^^^^ `bar` cannot be made into an object | = help: consider moving `dup` to another trait = help: consider moving `blah` to another trait - -error[E0038]: the trait `bar` cannot be made into an object - --> $DIR/trait-test-2.rs:11:6 +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/trait-test-2.rs:4:30 | LL | trait bar { fn dup(&self) -> Self; fn blah<X>(&self); } - | --- ---- ---- ...because method `blah` has generic type parameters + | --- ^^^^ ^^^^ ...because method `blah` has generic type parameters | | | | | ...because method `dup` references the `Self` type in its return type | this trait cannot be made into an object... -... + +error[E0038]: the trait `bar` cannot be made into an object + --> $DIR/trait-test-2.rs:11:6 + | LL | (box 10 as Box<dyn bar>).dup(); - | ^^^^^^ the trait `bar` cannot be made into an object + | ^^^^^^ `bar` cannot be made into an object | = help: consider moving `dup` to another trait = help: consider moving `blah` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/trait-test-2.rs:4:30 + | +LL | trait bar { fn dup(&self) -> Self; fn blah<X>(&self); } + | --- ^^^^ ^^^^ ...because method `blah` has generic type parameters + | | | + | | ...because method `dup` references the `Self` type in its return type + | this trait cannot be made into an object... = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn bar>>` for `Box<{integer}>` = note: required by cast to type `Box<dyn bar>` diff --git a/src/test/ui/type/type-parameter-defaults-referencing-Self-ppaux.stderr b/src/test/ui/type/type-parameter-defaults-referencing-Self-ppaux.stderr index 539189982a8..2de5f6eb0f0 100644 --- a/src/test/ui/type/type-parameter-defaults-referencing-Self-ppaux.stderr +++ b/src/test/ui/type/type-parameter-defaults-referencing-Self-ppaux.stderr @@ -13,15 +13,17 @@ LL | let y = x as dyn MyAdd<i32>; error[E0038]: the trait `MyAdd` cannot be made into an object --> $DIR/type-parameter-defaults-referencing-Self-ppaux.rs:14:18 | -LL | trait MyAdd<Rhs=Self> { fn add(&self, other: &Rhs) -> Self; } - | ----- ---- ...because method `add` references the `Self` type in its return type - | | - | this trait cannot be made into an object... -... LL | let y = x as dyn MyAdd<i32>; - | ^^^^^^^^^^^^^^ the trait `MyAdd` cannot be made into an object + | ^^^^^^^^^^^^^^ `MyAdd` cannot be made into an object | = help: consider moving `add` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/type-parameter-defaults-referencing-Self-ppaux.rs:6:55 + | +LL | trait MyAdd<Rhs=Self> { fn add(&self, other: &Rhs) -> Self; } + | ----- ^^^^ ...because method `add` references the `Self` type in its return type + | | + | this trait cannot be made into an object... error: aborting due to 2 previous errors diff --git a/src/test/ui/wf/wf-convert-unsafe-trait-obj-box.stderr b/src/test/ui/wf/wf-convert-unsafe-trait-obj-box.stderr index e707839a97e..29dfb585ac6 100644 --- a/src/test/ui/wf/wf-convert-unsafe-trait-obj-box.stderr +++ b/src/test/ui/wf/wf-convert-unsafe-trait-obj-box.stderr @@ -1,42 +1,48 @@ error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/wf-convert-unsafe-trait-obj-box.rs:16:33 | +LL | let t_box: Box<dyn Trait> = Box::new(S); + | ^^^^^^^^^^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-convert-unsafe-trait-obj-box.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | let t_box: Box<dyn Trait> = Box::new(S); - | ^^^^^^^^^^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn Trait>>` for `Box<S>` = note: required by cast to type `Box<dyn Trait>` error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/wf-convert-unsafe-trait-obj-box.rs:17:15 | +LL | takes_box(Box::new(S)); + | ^^^^^^^^^^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-convert-unsafe-trait-obj-box.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | takes_box(Box::new(S)); - | ^^^^^^^^^^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn Trait>>` for `Box<S>` = note: required by cast to type `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 | +LL | Box::new(S) as Box<dyn Trait>; + | ^^^^^^^^^^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-convert-unsafe-trait-obj-box.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | Box::new(S) as Box<dyn Trait>; - | ^^^^^^^^^^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn Trait>>` for `Box<S>` = note: required by cast to type `Box<dyn Trait>` diff --git a/src/test/ui/wf/wf-convert-unsafe-trait-obj.stderr b/src/test/ui/wf/wf-convert-unsafe-trait-obj.stderr index 08d4808b77d..02169f26f90 100644 --- a/src/test/ui/wf/wf-convert-unsafe-trait-obj.stderr +++ b/src/test/ui/wf/wf-convert-unsafe-trait-obj.stderr @@ -1,42 +1,48 @@ error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/wf-convert-unsafe-trait-obj.rs:16:25 | +LL | let t: &dyn Trait = &S; + | ^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-convert-unsafe-trait-obj.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | let t: &dyn Trait = &S; - | ^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Trait>` for `&S` = note: required by cast to type `&dyn Trait` error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/wf-convert-unsafe-trait-obj.rs:17:17 | +LL | takes_trait(&S); + | ^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-convert-unsafe-trait-obj.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | takes_trait(&S); - | ^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Trait>` for `&S` = note: required by cast to type `&dyn Trait` error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/wf-convert-unsafe-trait-obj.rs:15:5 | +LL | &S as &dyn Trait; + | ^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-convert-unsafe-trait-obj.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | &S as &dyn Trait; - | ^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Trait>` for `&S` = note: required by cast to type `&dyn Trait` diff --git a/src/test/ui/wf/wf-fn-where-clause.stderr b/src/test/ui/wf/wf-fn-where-clause.stderr index e7921f3496c..988cb2fa548 100644 --- a/src/test/ui/wf/wf-fn-where-clause.stderr +++ b/src/test/ui/wf/wf-fn-where-clause.stderr @@ -34,9 +34,10 @@ error[E0038]: the trait `Copy` cannot be made into an object --> $DIR/wf-fn-where-clause.rs:12:16 | LL | fn bar() where Vec<dyn Copy>:, {} - | ^^^^^^^^^^^^^ the trait `Copy` cannot be made into an object + | ^^^^^^^^^^^^^ `Copy` cannot be made into an object | = note: the trait cannot be made into an object because it requires `Self: Sized` + = note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> error: aborting due to 3 previous errors diff --git a/src/test/ui/wf/wf-object-safe.stderr b/src/test/ui/wf/wf-object-safe.stderr index 8935d766354..9b749f88fb8 100644 --- a/src/test/ui/wf/wf-object-safe.stderr +++ b/src/test/ui/wf/wf-object-safe.stderr @@ -1,15 +1,17 @@ error[E0038]: the trait `A` cannot be made into an object --> $DIR/wf-object-safe.rs:9:13 | -LL | trait A { - | - this trait cannot be made into an object... -LL | fn foo(&self, _x: &Self); - | ----- ...because method `foo` references the `Self` type in this parameter -... LL | let _x: &dyn A; - | ^^^^^^ the trait `A` cannot be made into an object + | ^^^^^^ `A` cannot be made into an object | = help: consider moving `foo` to another trait +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-object-safe.rs:5:23 + | +LL | trait A { + | - this trait cannot be made into an object... +LL | fn foo(&self, _x: &Self); + | ^^^^^ ...because method `foo` references the `Self` type in this parameter error: aborting due to previous error diff --git a/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr b/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr index d0f43f800fd..9dbd41ca368 100644 --- a/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr +++ b/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr @@ -15,28 +15,32 @@ LL | | } error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/wf-unsafe-trait-obj-match.rs:26:21 | +LL | Some(()) => &S, + | ^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-unsafe-trait-obj-match.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | Some(()) => &S, - | ^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Trait>` for `&S` = note: required by cast to type `&dyn Trait` error[E0038]: the trait `Trait` cannot be made into an object --> $DIR/wf-unsafe-trait-obj-match.rs:25:25 | +LL | let t: &dyn Trait = match opt() { + | ^^^^^^^^^^^ `Trait` cannot be made into an object + | +note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> + --> $DIR/wf-unsafe-trait-obj-match.rs:6:14 + | LL | trait Trait: Sized {} - | ----- ----- ...because it requires `Self: Sized` + | ----- ^^^^^ ...because it requires `Self: Sized` | | | this trait cannot be made into an object... -... -LL | let t: &dyn Trait = match opt() { - | ^^^^^^^^^^^ the trait `Trait` cannot be made into an object - | = note: required because of the requirements on the impl of `CoerceUnsized<&dyn Trait>` for `&R` = note: required by cast to type `&dyn Trait` |
