Suppress import errors for traits that couldve applied in method lookup on error
This commit is contained in:
parent
f6648f252a
commit
c3b696dec9
@ -199,6 +199,8 @@ pub(crate) fn lookup_method(
|
|||||||
self_ty, segment, span, call_expr, self_expr, &pick, args,
|
self_ty, segment, span, call_expr, self_expr, &pick, args,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// NOTE: on the failure path, we also record the possibly-used trait methods
|
||||||
|
// since an unused import warning is kinda distracting from the method error.
|
||||||
for &import_id in &pick.import_ids {
|
for &import_id in &pick.import_ids {
|
||||||
debug!("used_trait_import: {:?}", import_id);
|
debug!("used_trait_import: {:?}", import_id);
|
||||||
self.typeck_results.borrow_mut().used_trait_imports.insert(import_id);
|
self.typeck_results.borrow_mut().used_trait_imports.insert(import_id);
|
||||||
|
@ -191,6 +191,14 @@ pub(crate) fn report_method_error(
|
|||||||
expected: Expectation<'tcx>,
|
expected: Expectation<'tcx>,
|
||||||
trait_missing_method: bool,
|
trait_missing_method: bool,
|
||||||
) -> ErrorGuaranteed {
|
) -> ErrorGuaranteed {
|
||||||
|
// NOTE: Reporting a method error should also suppress any unused trait errors,
|
||||||
|
// since the method error is very possibly the reason why the trait wasn't used.
|
||||||
|
for &import_id in
|
||||||
|
self.tcx.in_scope_traits(call_id).into_iter().flatten().flat_map(|c| &c.import_ids)
|
||||||
|
{
|
||||||
|
self.typeck_results.borrow_mut().used_trait_imports.insert(import_id);
|
||||||
|
}
|
||||||
|
|
||||||
let (span, sugg_span, source, item_name, args) = match self.tcx.hir_node(call_id) {
|
let (span, sugg_span, source, item_name, args) = match self.tcx.hir_node(call_id) {
|
||||||
hir::Node::Expr(&hir::Expr {
|
hir::Node::Expr(&hir::Expr {
|
||||||
kind: hir::ExprKind::MethodCall(segment, rcvr, args, _),
|
kind: hir::ExprKind::MethodCall(segment, rcvr, args, _),
|
||||||
|
17
tests/ui/use/unused-trait-with-method-err.rs
Normal file
17
tests/ui/use/unused-trait-with-method-err.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Test that we don't issue an unused import warning when there's
|
||||||
|
// a method lookup error and that trait was possibly applicable.
|
||||||
|
|
||||||
|
use foo::Bar;
|
||||||
|
|
||||||
|
mod foo {
|
||||||
|
pub trait Bar {
|
||||||
|
fn uwu(&self) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
Foo.uwu();
|
||||||
|
//~^ ERROR no method named `uwu` found for struct `Foo` in the current scope
|
||||||
|
}
|
19
tests/ui/use/unused-trait-with-method-err.stderr
Normal file
19
tests/ui/use/unused-trait-with-method-err.stderr
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
error[E0599]: no method named `uwu` found for struct `Foo` in the current scope
|
||||||
|
--> $DIR/unused-trait-with-method-err.rs:15:9
|
||||||
|
|
|
||||||
|
LL | struct Foo;
|
||||||
|
| ---------- method `uwu` not found for this struct
|
||||||
|
...
|
||||||
|
LL | Foo.uwu();
|
||||||
|
| ^^^ method not found in `Foo`
|
||||||
|
|
|
||||||
|
= help: items from traits can only be used if the trait is implemented and in scope
|
||||||
|
note: `Bar` defines an item `uwu`, perhaps you need to implement it
|
||||||
|
--> $DIR/unused-trait-with-method-err.rs:7:5
|
||||||
|
|
|
||||||
|
LL | pub trait Bar {
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0599`.
|
Loading…
Reference in New Issue
Block a user