parent
88189a71e4
commit
b1688b48d2
@ -122,7 +122,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
],
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
} else {
|
||||
} else if diag.is_error() {
|
||||
// We'll emit the object safety error already, with a structured suggestion.
|
||||
diag.downgrade_to_delayed_bug();
|
||||
}
|
||||
@ -148,8 +148,10 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
}
|
||||
if !is_object_safe {
|
||||
diag.note(format!("`{trait_name}` it is not object safe, so it can't be `dyn`"));
|
||||
// We'll emit the object safety error already, with a structured suggestion.
|
||||
diag.downgrade_to_delayed_bug();
|
||||
if diag.is_error() {
|
||||
// We'll emit the object safety error already, with a structured suggestion.
|
||||
diag.downgrade_to_delayed_bug();
|
||||
}
|
||||
} else {
|
||||
let sugg = if let hir::TyKind::TraitObject([_, _, ..], _, _) = self_ty.kind {
|
||||
// There are more than one trait bound, we need surrounding parentheses.
|
||||
|
9
tests/ui/object-safety/avoid-ice-on-warning-2.rs
Normal file
9
tests/ui/object-safety/avoid-ice-on-warning-2.rs
Normal file
@ -0,0 +1,9 @@
|
||||
fn id<F>(f: Copy) -> usize {
|
||||
//~^ WARN trait objects without an explicit `dyn` are deprecated
|
||||
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| WARN trait objects without an explicit `dyn` are deprecated
|
||||
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| ERROR the trait `Copy` cannot be made into an object
|
||||
f()
|
||||
}
|
||||
fn main() {}
|
50
tests/ui/object-safety/avoid-ice-on-warning-2.stderr
Normal file
50
tests/ui/object-safety/avoid-ice-on-warning-2.stderr
Normal file
@ -0,0 +1,50 @@
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/avoid-ice-on-warning-2.rs:1:13
|
||||
|
|
||||
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: `Copy` it is not object safe, so it can't be `dyn`
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
help: use a new generic type parameter, constrained by `Copy`
|
||||
|
|
||||
LL | fn id<F, T: Copy>(f: T) -> usize {
|
||||
| +++++++++ ~
|
||||
help: you can also use an opaque type, but users won't be able to specify the type parameter when calling the `fn`, having to rely exclusively on type inference
|
||||
|
|
||||
LL | fn id<F>(f: impl Copy) -> usize {
|
||||
| ++++
|
||||
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/avoid-ice-on-warning-2.rs:1:13
|
||||
|
|
||||
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: `Copy` it is not object safe, so it can't be `dyn`
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: use a new generic type parameter, constrained by `Copy`
|
||||
|
|
||||
LL | fn id<F, T: Copy>(f: T) -> usize {
|
||||
| +++++++++ ~
|
||||
help: you can also use an opaque type, but users won't be able to specify the type parameter when calling the `fn`, having to rely exclusively on type inference
|
||||
|
|
||||
LL | fn id<F>(f: impl Copy) -> usize {
|
||||
| ++++
|
||||
|
||||
error[E0038]: the trait `Copy` cannot be made into an object
|
||||
--> $DIR/avoid-ice-on-warning-2.rs:1:13
|
||||
|
|
||||
LL | fn id<F>(f: Copy) -> usize {
|
||||
| ^^^^ `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 1 previous error; 2 warnings emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0038`.
|
6
tests/ui/object-safety/avoid-ice-on-warning.rs
Normal file
6
tests/ui/object-safety/avoid-ice-on-warning.rs
Normal file
@ -0,0 +1,6 @@
|
||||
fn call_this<F>(f: F) : Fn(&str) + call_that {}
|
||||
//~^ ERROR return types are denoted using `->`
|
||||
//~| ERROR cannot find trait `call_that` in this scope
|
||||
//~| WARN trait objects without an explicit `dyn` are deprecated
|
||||
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
fn main() {}
|
29
tests/ui/object-safety/avoid-ice-on-warning.stderr
Normal file
29
tests/ui/object-safety/avoid-ice-on-warning.stderr
Normal file
@ -0,0 +1,29 @@
|
||||
error: return types are denoted using `->`
|
||||
--> $DIR/avoid-ice-on-warning.rs:1:23
|
||||
|
|
||||
LL | fn call_this<F>(f: F) : Fn(&str) + call_that {}
|
||||
| ^ help: use `->` instead
|
||||
|
||||
error[E0405]: cannot find trait `call_that` in this scope
|
||||
--> $DIR/avoid-ice-on-warning.rs:1:36
|
||||
|
|
||||
LL | fn call_this<F>(f: F) : Fn(&str) + call_that {}
|
||||
| ^^^^^^^^^ not found in this scope
|
||||
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/avoid-ice-on-warning.rs:1:25
|
||||
|
|
||||
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: `Fn(&str) + call_that` is not object safe, use `impl Fn(&str) + call_that` to return an opaque type, as long as you return a single underlying type
|
||||
|
|
||||
LL | fn call_this<F>(f: F) : impl Fn(&str) + call_that {}
|
||||
| ++++
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0405`.
|
Loading…
x
Reference in New Issue
Block a user