mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #120530 - trevyn:issue-116434, r=compiler-errors
Be less confident when `dyn` suggestion is not checked for object safety #120275 no longer checks bare traits for object safety when making a `dyn` suggestion on Rust < 2021. In this case, qualify the suggestion with a note that the trait must be object safe, to prevent user confusion as seen in #116434 r? ```@fmease```
This commit is contained in:
commit
c4371a79de
@ -243,7 +243,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
tcx.node_span_lint(BARE_TRAIT_OBJECTS, self_ty.hir_id, self_ty.span, msg, |lint| {
|
||||
if self_ty.span.can_be_used_for_suggestions() {
|
||||
lint.multipart_suggestion_verbose(
|
||||
"use `dyn`",
|
||||
"if this is an object-safe trait, use `dyn`",
|
||||
sugg,
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
|
@ -182,7 +182,7 @@ LL | type H = Fn(u8) -> (u8)::Output;
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | type H = <dyn Fn(u8) -> (u8)>::Output;
|
||||
| ++++ +
|
||||
|
@ -11,7 +11,7 @@ note: the lint level is defined here
|
||||
|
|
||||
LL | #[deny(bare_trait_objects)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn function(x: &dyn SomeTrait, y: Box<SomeTrait>) {
|
||||
| +++
|
||||
@ -24,7 +24,7 @@ LL | fn function(x: &SomeTrait, y: Box<SomeTrait>) {
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn function(x: &SomeTrait, y: Box<dyn SomeTrait>) {
|
||||
| +++
|
||||
@ -37,7 +37,7 @@ LL | let _x: &SomeTrait = todo!();
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let _x: &dyn SomeTrait = todo!();
|
||||
| +++
|
||||
|
@ -11,7 +11,7 @@ note: the lint level is defined here
|
||||
|
|
||||
LL | #![deny(bare_trait_objects)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | <dyn fmt::Debug>::fmt(self, f)
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | fn ice() -> impl AsRef<Fn(&())> {
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn ice() -> impl AsRef<dyn Fn(&())> {
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8);
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let x: u8 = <dyn BitXor>::bitor(0 as u8, 0 as u8);
|
||||
| ++++ +
|
||||
@ -35,7 +35,7 @@ LL | let g = BitXor::bitor;
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let g = <dyn BitXor>::bitor;
|
||||
| ++++ +
|
||||
|
@ -7,7 +7,7 @@ LL | Trait::nonexistent(());
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | <dyn Trait>::nonexistent(());
|
||||
| ++++ +
|
||||
|
@ -21,7 +21,7 @@ LL | eq::<dyn, Foo>
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | eq::<dyn, dyn Foo>
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | let _: Dyn::Ty;
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let _: <dyn Dyn>::Ty;
|
||||
| ++++ +
|
||||
@ -26,7 +26,7 @@ LL | Dyn::func();
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | <dyn Dyn>::func();
|
||||
| ++++ +
|
||||
@ -39,7 +39,7 @@ LL | ::Dyn::func();
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | <dyn (::Dyn)>::func();
|
||||
| ++++++ ++
|
||||
@ -52,7 +52,7 @@ LL | Dyn::CONST;
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | <dyn Dyn>::CONST;
|
||||
| ++++ +
|
||||
|
@ -7,7 +7,7 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: requested on the command line with `--force-warn bare-trait-objects`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: requested on the command line with `--force-warn bare-trait-objects`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
| +++
|
||||
|
@ -8,7 +8,7 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms`
|
||||
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
| +++
|
||||
|
@ -8,7 +8,7 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms`
|
||||
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
| +++
|
||||
|
@ -8,7 +8,7 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms`
|
||||
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | fn id<F>(f: Copy) -> usize {
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn id<F>(f: dyn Copy) -> usize {
|
||||
| +++
|
||||
@ -21,7 +21,7 @@ LL | fn id<F>(f: Copy) -> usize {
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn id<F>(f: dyn Copy) -> usize {
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | trait B { fn f(a: A) -> A; }
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | trait B { fn f(a: dyn A) -> A; }
|
||||
| +++
|
||||
@ -20,7 +20,7 @@ LL | trait B { fn f(a: A) -> A; }
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | trait B { fn f(a: A) -> dyn A; }
|
||||
| +++
|
||||
@ -33,7 +33,7 @@ LL | trait A { fn g(b: B) -> B; }
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | trait A { fn g(b: dyn B) -> B; }
|
||||
| +++
|
||||
@ -46,7 +46,7 @@ LL | trait A { fn g(b: B) -> B; }
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | trait A { fn g(b: B) -> dyn B; }
|
||||
| +++
|
||||
@ -60,7 +60,7 @@ LL | trait B { fn f(a: A) -> A; }
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | trait B { fn f(a: dyn A) -> A; }
|
||||
| +++
|
||||
@ -96,7 +96,7 @@ LL | trait A { fn g(b: B) -> B; }
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | trait A { fn g(b: dyn B) -> B; }
|
||||
| +++
|
||||
|
@ -19,7 +19,7 @@ LL | fn call_this<F>(f: F) : Fn(&str) + call_that {}
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn call_this<F>(f: F) : dyn Fn(&str) + call_that {}
|
||||
| +++
|
||||
|
@ -11,7 +11,7 @@ note: the lint level is defined here
|
||||
|
|
||||
LL | #![deny(bare_trait_objects)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn ord_prefer_dot(s: String) -> dyn Ord {
|
||||
| +++
|
||||
|
@ -25,7 +25,7 @@ LL | let _: Box<(Obj) + (?Sized) + (for<'a> Trait<'a>)>;
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let _: Box<dyn (Obj) + (?Sized) + (for<'a> Trait<'a>)>;
|
||||
| +++
|
||||
@ -49,7 +49,7 @@ LL | let _: Box<?Sized + (for<'a> Trait<'a>) + (Obj)>;
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let _: Box<dyn ?Sized + (for<'a> Trait<'a>) + (Obj)>;
|
||||
| +++
|
||||
@ -73,7 +73,7 @@ LL | let _: Box<for<'a> Trait<'a> + (Obj) + (?Sized)>;
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let _: Box<dyn for<'a> Trait<'a> + (Obj) + (?Sized)>;
|
||||
| +++
|
||||
|
23
tests/ui/suggestions/issue-116434-2015.rs
Normal file
23
tests/ui/suggestions/issue-116434-2015.rs
Normal file
@ -0,0 +1,23 @@
|
||||
trait Foo {
|
||||
type Clone;
|
||||
fn foo() -> Clone;
|
||||
//~^ WARNING trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
|
||||
//~| WARNING this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| WARNING trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
|
||||
//~| WARNING this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| ERROR the trait `Clone` cannot be made into an object [E0038]
|
||||
}
|
||||
|
||||
trait DbHandle: Sized {}
|
||||
|
||||
trait DbInterface {
|
||||
type DbHandle;
|
||||
fn handle() -> DbHandle;
|
||||
//~^ WARNING trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
|
||||
//~| WARNING this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| WARNING trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
|
||||
//~| WARNING this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| ERROR the trait `DbHandle` cannot be made into an object [E0038]
|
||||
}
|
||||
|
||||
fn main() {}
|
81
tests/ui/suggestions/issue-116434-2015.stderr
Normal file
81
tests/ui/suggestions/issue-116434-2015.stderr
Normal file
@ -0,0 +1,81 @@
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/issue-116434-2015.rs:3:17
|
||||
|
|
||||
LL | fn foo() -> Clone;
|
||||
| ^^^^^
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn foo() -> dyn Clone;
|
||||
| +++
|
||||
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/issue-116434-2015.rs:15:20
|
||||
|
|
||||
LL | fn handle() -> DbHandle;
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn handle() -> dyn DbHandle;
|
||||
| +++
|
||||
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/issue-116434-2015.rs:3:17
|
||||
|
|
||||
LL | fn foo() -> Clone;
|
||||
| ^^^^^
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn foo() -> dyn Clone;
|
||||
| +++
|
||||
|
||||
error[E0038]: the trait `Clone` cannot be made into an object
|
||||
--> $DIR/issue-116434-2015.rs:3:17
|
||||
|
|
||||
LL | fn foo() -> Clone;
|
||||
| ^^^^^ `Clone` 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>
|
||||
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/issue-116434-2015.rs:15:20
|
||||
|
|
||||
LL | fn handle() -> DbHandle;
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn handle() -> dyn DbHandle;
|
||||
| +++
|
||||
|
||||
error[E0038]: the trait `DbHandle` cannot be made into an object
|
||||
--> $DIR/issue-116434-2015.rs:15:20
|
||||
|
|
||||
LL | fn handle() -> DbHandle;
|
||||
| ^^^^^^^^ `DbHandle` 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-116434-2015.rs:11:17
|
||||
|
|
||||
LL | trait DbHandle: Sized {}
|
||||
| -------- ^^^^^ ...because it requires `Self: Sized`
|
||||
| |
|
||||
| this trait cannot be made into an object...
|
||||
|
||||
error: aborting due to 2 previous errors; 4 warnings emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0038`.
|
17
tests/ui/suggestions/issue-116434-2021.rs
Normal file
17
tests/ui/suggestions/issue-116434-2021.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// edition:2021
|
||||
|
||||
trait Foo {
|
||||
type Clone;
|
||||
fn foo() -> Clone;
|
||||
//~^ ERROR the trait `Clone` cannot be made into an object [E0038]
|
||||
}
|
||||
|
||||
trait DbHandle: Sized {}
|
||||
|
||||
trait DbInterface {
|
||||
type DbHandle;
|
||||
fn handle() -> DbHandle;
|
||||
//~^ ERROR the trait `DbHandle` cannot be made into an object [E0038]
|
||||
}
|
||||
|
||||
fn main() {}
|
26
tests/ui/suggestions/issue-116434-2021.stderr
Normal file
26
tests/ui/suggestions/issue-116434-2021.stderr
Normal file
@ -0,0 +1,26 @@
|
||||
error[E0038]: the trait `Clone` cannot be made into an object
|
||||
--> $DIR/issue-116434-2021.rs:5:17
|
||||
|
|
||||
LL | fn foo() -> Clone;
|
||||
| ^^^^^ `Clone` 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[E0038]: the trait `DbHandle` cannot be made into an object
|
||||
--> $DIR/issue-116434-2021.rs:13:20
|
||||
|
|
||||
LL | fn handle() -> DbHandle;
|
||||
| ^^^^^^^^ `DbHandle` 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-116434-2021.rs:9:17
|
||||
|
|
||||
LL | trait DbHandle: Sized {}
|
||||
| -------- ^^^^^ ...because it requires `Self: Sized`
|
||||
| |
|
||||
| this trait cannot be made into an object...
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0038`.
|
@ -11,7 +11,7 @@ note: the lint level is defined here
|
||||
|
|
||||
LL | #![deny(bare_trait_objects)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | bar: Box<dyn Bar>,
|
||||
| +++
|
||||
@ -24,7 +24,7 @@ LL | pub struct Foo {
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | dyn pub struct Foo {
|
||||
| +++
|
||||
|
@ -40,7 +40,7 @@ LL | impl<'a, T> Struct<T> for Trait<'a, T> {}
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | impl<'a, T> Struct<T> for dyn Trait<'a, T> {}
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | fn foo(_x: Foo + Send) {
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | fn foo(_x: dyn Foo + Send) {
|
||||
| +++
|
||||
|
@ -7,7 +7,7 @@ LL | let a = Foo::lol();
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let a = <dyn Foo>::lol();
|
||||
| ++++ +
|
||||
@ -26,7 +26,7 @@ LL | let b = Foo::<_>::lol();
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let b = <dyn Foo::<_>>::lol();
|
||||
| ++++ +
|
||||
@ -45,7 +45,7 @@ LL | let c = Bar::lol();
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let c = <dyn Bar>::lol();
|
||||
| ++++ +
|
||||
@ -64,7 +64,7 @@ LL | let d = Bar::<usize, _>::lol();
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let d = <dyn Bar::<usize, _>>::lol();
|
||||
| ++++ +
|
||||
@ -83,7 +83,7 @@ LL | let e = Bar::<usize>::lol();
|
||||
|
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||
help: use `dyn`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | let e = <dyn Bar::<usize>>::lol();
|
||||
| ++++ +
|
||||
|
Loading…
Reference in New Issue
Block a user