mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
E0191 suggestion correction, inserts turbofish without dyn (#91997)
This commit is contained in:
parent
289deb9ed7
commit
7c88bda1cb
@ -12,9 +12,9 @@ use rustc_errors::MultiSpan;
|
||||
use rustc_errors::{
|
||||
codes::*, pluralize, struct_span_code_err, Applicability, Diag, ErrorGuaranteed,
|
||||
};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::{self as hir, Node};
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::query::Key;
|
||||
use rustc_middle::ty::print::{PrintPolyTraitRefExt as _, PrintTraitRefExt as _};
|
||||
@ -745,7 +745,15 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||
if object_safety_violations {
|
||||
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) {
|
||||
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 {
|
||||
// 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
|
||||
@ -901,6 +909,10 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||
// `Trait<'a, Item = Type>` while accounting for the `<'a>` in the
|
||||
// suggestion.
|
||||
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 {
|
||||
// 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>`.
|
||||
|
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
|
||||
|
|
||||
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
|
||||
|
||||
|
@ -16,7 +16,7 @@ error[E0191]: the value of the associated type `Output` in `BitXor` must be spec
|
||||
--> $DIR/issue-28344.rs:4:17
|
||||
|
|
||||
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
|
||||
--> $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
|
||||
|
|
||||
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
|
||||
--> $DIR/issue-28344.rs:10:21
|
||||
|
Loading…
Reference in New Issue
Block a user