E0191 suggestion correction, inserts turbofish without dyn (#91997)
This commit is contained in:
parent
289deb9ed7
commit
7c88bda1cb
@ -12,9 +12,9 @@
|
|||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
codes::*, pluralize, struct_span_code_err, Applicability, Diag, ErrorGuaranteed,
|
codes::*, pluralize, struct_span_code_err, Applicability, Diag, ErrorGuaranteed,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
|
use rustc_hir::{self as hir, Node};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::query::Key;
|
use rustc_middle::query::Key;
|
||||||
use rustc_middle::ty::print::{PrintPolyTraitRefExt as _, PrintTraitRefExt as _};
|
use rustc_middle::ty::print::{PrintPolyTraitRefExt as _, PrintTraitRefExt as _};
|
||||||
@ -745,7 +745,15 @@ pub(crate) fn complain_about_missing_assoc_tys(
|
|||||||
if object_safety_violations {
|
if object_safety_violations {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// related to issue #91997, turbofishes added only when in an expr or pat
|
||||||
|
let mut in_expr_or_pat = false;
|
||||||
if let ([], [bound]) = (&potential_assoc_types[..], &trait_bounds) {
|
if let ([], [bound]) = (&potential_assoc_types[..], &trait_bounds) {
|
||||||
|
let grandparent = tcx.parent_hir_node(tcx.parent_hir_id(bound.trait_ref.hir_ref_id));
|
||||||
|
in_expr_or_pat = match grandparent {
|
||||||
|
Node::Expr(_) | Node::Pat(_) => true,
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
match bound.trait_ref.path.segments {
|
match bound.trait_ref.path.segments {
|
||||||
// FIXME: `trait_ref.path.span` can point to a full path with multiple
|
// FIXME: `trait_ref.path.span` can point to a full path with multiple
|
||||||
// segments, even though `trait_ref.path.segments` is of length `1`. Work
|
// segments, even though `trait_ref.path.segments` is of length `1`. Work
|
||||||
@ -901,6 +909,10 @@ pub(crate) fn complain_about_missing_assoc_tys(
|
|||||||
// `Trait<'a, Item = Type>` while accounting for the `<'a>` in the
|
// `Trait<'a, Item = Type>` while accounting for the `<'a>` in the
|
||||||
// suggestion.
|
// suggestion.
|
||||||
format!("{}, {}>", &snippet[..snippet.len() - 1], types.join(", "))
|
format!("{}, {}>", &snippet[..snippet.len() - 1], types.join(", "))
|
||||||
|
} else if in_expr_or_pat {
|
||||||
|
// The user wrote `Iterator`, so we don't have a type we can suggest, but at
|
||||||
|
// least we can clue them to the correct syntax `Iterator::<Item = Type>`.
|
||||||
|
format!("{}::<{}>", snippet, types.join(", "))
|
||||||
} else {
|
} else {
|
||||||
// The user wrote `Iterator`, so we don't have a type we can suggest, but at
|
// The user wrote `Iterator`, so we don't have a type we can suggest, but at
|
||||||
// least we can clue them to the correct syntax `Iterator<Item = Type>`.
|
// least we can clue them to the correct syntax `Iterator<Item = Type>`.
|
||||||
|
8
tests/ui/errors/dynless-turbofish-e0191-issue-91997.rs
Normal file
8
tests/ui/errors/dynless-turbofish-e0191-issue-91997.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
trait MyIterator : Iterator {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = MyIterator::next;
|
||||||
|
}
|
||||||
|
//~^^ ERROR the value of the associated type `Item` in `Iterator` must be specified [E0191]
|
||||||
|
//~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
|
||||||
|
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
23
tests/ui/errors/dynless-turbofish-e0191-issue-91997.stderr
Normal file
23
tests/ui/errors/dynless-turbofish-e0191-issue-91997.stderr
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
warning: trait objects without an explicit `dyn` are deprecated
|
||||||
|
--> $DIR/dynless-turbofish-e0191-issue-91997.rs:4:13
|
||||||
|
|
|
||||||
|
LL | let _ = MyIterator::next;
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= 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 | let _ = <dyn MyIterator>::next;
|
||||||
|
| ++++ +
|
||||||
|
|
||||||
|
error[E0191]: the value of the associated type `Item` in `Iterator` must be specified
|
||||||
|
--> $DIR/dynless-turbofish-e0191-issue-91997.rs:4:13
|
||||||
|
|
|
||||||
|
LL | let _ = MyIterator::next;
|
||||||
|
| ^^^^^^^^^^ help: specify the associated type: `MyIterator::<Item = Type>`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0191`.
|
@ -23,7 +23,7 @@ error[E0191]: the value of the associated type `Output` in `FnOnce` must be spec
|
|||||||
--> $DIR/issue-23024.rs:8:39
|
--> $DIR/issue-23024.rs:8:39
|
||||||
|
|
|
|
||||||
LL | println!("{:?}",(vfnfer[0] as dyn Fn)(3));
|
LL | println!("{:?}",(vfnfer[0] as dyn Fn)(3));
|
||||||
| ^^ help: specify the associated type: `Fn<Output = Type>`
|
| ^^ help: specify the associated type: `Fn::<Output = Type>`
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ error[E0191]: the value of the associated type `Output` in `BitXor` must be spec
|
|||||||
--> $DIR/issue-28344.rs:4:17
|
--> $DIR/issue-28344.rs:4:17
|
||||||
|
|
|
|
||||||
LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8);
|
LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8);
|
||||||
| ^^^^^^ help: specify the associated type: `BitXor<Output = Type>`
|
| ^^^^^^ help: specify the associated type: `BitXor::<Output = Type>`
|
||||||
|
|
||||||
error[E0599]: no function or associated item named `bitor` found for trait object `dyn BitXor<_>` in the current scope
|
error[E0599]: no function or associated item named `bitor` found for trait object `dyn BitXor<_>` in the current scope
|
||||||
--> $DIR/issue-28344.rs:4:25
|
--> $DIR/issue-28344.rs:4:25
|
||||||
@ -44,7 +44,7 @@ error[E0191]: the value of the associated type `Output` in `BitXor` must be spec
|
|||||||
--> $DIR/issue-28344.rs:10:13
|
--> $DIR/issue-28344.rs:10:13
|
||||||
|
|
|
|
||||||
LL | let g = BitXor::bitor;
|
LL | let g = BitXor::bitor;
|
||||||
| ^^^^^^ help: specify the associated type: `BitXor<Output = Type>`
|
| ^^^^^^ help: specify the associated type: `BitXor::<Output = Type>`
|
||||||
|
|
||||||
error[E0599]: no function or associated item named `bitor` found for trait object `dyn BitXor<_>` in the current scope
|
error[E0599]: no function or associated item named `bitor` found for trait object `dyn BitXor<_>` in the current scope
|
||||||
--> $DIR/issue-28344.rs:10:21
|
--> $DIR/issue-28344.rs:10:21
|
||||||
|
Loading…
Reference in New Issue
Block a user