Rollup merge of #88509 - m-ou-se:dyn-no-left-shift-right-shift-just-single-angle-brackets-please-thanks, r=petrochenkov
Don't suggest extra <> in dyn suggestion. Fixes https://github.com/rust-lang/rust/issues/88508
This commit is contained in:
commit
feafda8cd3
4 changed files with 81 additions and 5 deletions
|
@ -914,7 +914,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
});
|
});
|
||||||
|
|
||||||
if result.is_ok() {
|
if result.is_ok() {
|
||||||
self.maybe_lint_bare_trait(qpath, hir_id);
|
self.maybe_lint_bare_trait(qpath, hir_id, span);
|
||||||
self.register_wf_obligation(ty.into(), qself.span, traits::WellFormed(None));
|
self.register_wf_obligation(ty.into(), qself.span, traits::WellFormed(None));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -927,7 +927,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn maybe_lint_bare_trait(&self, qpath: &QPath<'_>, hir_id: hir::HirId) {
|
fn maybe_lint_bare_trait(&self, qpath: &QPath<'_>, hir_id: hir::HirId, span: Span) {
|
||||||
if let QPath::TypeRelative(self_ty, _) = qpath {
|
if let QPath::TypeRelative(self_ty, _) = qpath {
|
||||||
if let TyKind::TraitObject([poly_trait_ref, ..], _, TraitObjectSyntax::None) =
|
if let TyKind::TraitObject([poly_trait_ref, ..], _, TraitObjectSyntax::None) =
|
||||||
self_ty.kind
|
self_ty.kind
|
||||||
|
@ -935,10 +935,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let msg = "trait objects without an explicit `dyn` are deprecated";
|
let msg = "trait objects without an explicit `dyn` are deprecated";
|
||||||
let (sugg, app) = match self.tcx.sess.source_map().span_to_snippet(self_ty.span) {
|
let (sugg, app) = match self.tcx.sess.source_map().span_to_snippet(self_ty.span) {
|
||||||
Ok(s) if poly_trait_ref.trait_ref.path.is_global() => {
|
Ok(s) if poly_trait_ref.trait_ref.path.is_global() => {
|
||||||
(format!("<dyn ({})>", s), Applicability::MachineApplicable)
|
(format!("dyn ({})", s), Applicability::MachineApplicable)
|
||||||
}
|
}
|
||||||
Ok(s) => (format!("<dyn {}>", s), Applicability::MachineApplicable),
|
Ok(s) => (format!("dyn {}", s), Applicability::MachineApplicable),
|
||||||
Err(_) => ("<dyn <type>>".to_string(), Applicability::HasPlaceholders),
|
Err(_) => ("dyn <type>".to_string(), Applicability::HasPlaceholders),
|
||||||
|
};
|
||||||
|
// Wrap in `<..>` if it isn't already.
|
||||||
|
let sugg = match self.tcx.sess.source_map().span_to_snippet(span) {
|
||||||
|
Ok(s) if s.starts_with('<') => sugg,
|
||||||
|
_ => format!("<{}>", sugg),
|
||||||
};
|
};
|
||||||
let replace = String::from("use `dyn`");
|
let replace = String::from("use `dyn`");
|
||||||
if self.sess().edition() >= Edition::Edition2021 {
|
if self.sess().edition() >= Edition::Edition2021 {
|
||||||
|
|
23
src/test/ui/dyn-keyword/dyn-angle-brackets.fixed
Normal file
23
src/test/ui/dyn-keyword/dyn-angle-brackets.fixed
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// See https://github.com/rust-lang/rust/issues/88508
|
||||||
|
// run-rustfix
|
||||||
|
// edition:2018
|
||||||
|
#![deny(bare_trait_objects)]
|
||||||
|
#![allow(dead_code)]
|
||||||
|
#![allow(unused_imports)]
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Foo;
|
||||||
|
|
||||||
|
impl fmt::Display for Foo {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
<dyn fmt::Debug>::fmt(self, f)
|
||||||
|
//~^ ERROR trait objects without an explicit `dyn` are deprecated
|
||||||
|
//~| WARNING this is accepted in the current edition
|
||||||
|
//~| ERROR trait objects without an explicit `dyn` are deprecated
|
||||||
|
//~| WARNING this is accepted in the current edition
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
23
src/test/ui/dyn-keyword/dyn-angle-brackets.rs
Normal file
23
src/test/ui/dyn-keyword/dyn-angle-brackets.rs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// See https://github.com/rust-lang/rust/issues/88508
|
||||||
|
// run-rustfix
|
||||||
|
// edition:2018
|
||||||
|
#![deny(bare_trait_objects)]
|
||||||
|
#![allow(dead_code)]
|
||||||
|
#![allow(unused_imports)]
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Foo;
|
||||||
|
|
||||||
|
impl fmt::Display for Foo {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
<fmt::Debug>::fmt(self, f)
|
||||||
|
//~^ ERROR trait objects without an explicit `dyn` are deprecated
|
||||||
|
//~| WARNING this is accepted in the current edition
|
||||||
|
//~| ERROR trait objects without an explicit `dyn` are deprecated
|
||||||
|
//~| WARNING this is accepted in the current edition
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
25
src/test/ui/dyn-keyword/dyn-angle-brackets.stderr
Normal file
25
src/test/ui/dyn-keyword/dyn-angle-brackets.stderr
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
error: trait objects without an explicit `dyn` are deprecated
|
||||||
|
--> $DIR/dyn-angle-brackets.rs:15:10
|
||||||
|
|
|
||||||
|
LL | <fmt::Debug>::fmt(self, f)
|
||||||
|
| ^^^^^^^^^^ help: use `dyn`: `dyn fmt::Debug`
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/dyn-angle-brackets.rs:4:9
|
||||||
|
|
|
||||||
|
LL | #![deny(bare_trait_objects)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
= 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>
|
||||||
|
|
||||||
|
error: trait objects without an explicit `dyn` are deprecated
|
||||||
|
--> $DIR/dyn-angle-brackets.rs:15:10
|
||||||
|
|
|
||||||
|
LL | <fmt::Debug>::fmt(self, f)
|
||||||
|
| ^^^^^^^^^^ help: use `dyn`: `dyn fmt::Debug`
|
||||||
|
|
|
||||||
|
= 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>
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue