Don't compute name of associated item if it's an RPITIT
This commit is contained in:
parent
49e5e4e3a5
commit
6033e9df02
6 changed files with 72 additions and 10 deletions
|
@ -486,15 +486,15 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
|
||||||
let items: &AssocItems = self.tcx.associated_items(self.def_id);
|
let items: &AssocItems = self.tcx.associated_items(self.def_id);
|
||||||
items
|
items
|
||||||
.in_definition_order()
|
.in_definition_order()
|
||||||
.filter(|item| item.is_type())
|
|
||||||
.filter(|item| {
|
.filter(|item| {
|
||||||
!self
|
item.is_type()
|
||||||
.gen_args
|
&& !item.is_impl_trait_in_trait()
|
||||||
.constraints
|
&& !self
|
||||||
.iter()
|
.gen_args
|
||||||
.any(|constraint| constraint.ident.name == item.name())
|
.constraints
|
||||||
|
.iter()
|
||||||
|
.any(|constraint| constraint.ident.name == item.name())
|
||||||
})
|
})
|
||||||
.filter(|item| !item.is_impl_trait_in_trait())
|
|
||||||
.map(|item| self.tcx.item_ident(item.def_id).to_string())
|
.map(|item| self.tcx.item_ident(item.def_id).to_string())
|
||||||
.collect()
|
.collect()
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -29,7 +29,7 @@ use rustc_errors::codes::*;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
Applicability, Diag, DiagCtxtHandle, ErrorGuaranteed, FatalError, struct_span_code_err,
|
Applicability, Diag, DiagCtxtHandle, ErrorGuaranteed, FatalError, struct_span_code_err,
|
||||||
};
|
};
|
||||||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Namespace, Res};
|
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::{self as hir, AnonConst, GenericArg, GenericArgs, HirId};
|
use rustc_hir::{self as hir, AnonConst, GenericArg, GenericArgs, HirId};
|
||||||
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
|
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
|
||||||
|
@ -1731,9 +1731,9 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
tcx.associated_items(*trait_def_id)
|
tcx.associated_items(*trait_def_id)
|
||||||
.in_definition_order()
|
.in_definition_order()
|
||||||
.any(|i| {
|
.any(|i| {
|
||||||
i.namespace() == Namespace::TypeNS
|
i.is_type()
|
||||||
|
&& !i.is_impl_trait_in_trait()
|
||||||
&& i.ident(tcx).normalize_to_macros_2_0() == assoc_ident
|
&& i.ident(tcx).normalize_to_macros_2_0() == assoc_ident
|
||||||
&& i.is_type()
|
|
||||||
})
|
})
|
||||||
// Consider only accessible traits
|
// Consider only accessible traits
|
||||||
&& tcx.visibility(*trait_def_id)
|
&& tcx.visibility(*trait_def_id)
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
trait Foo {
|
||||||
|
fn rpitit() -> impl Sized;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that we don't try to probe the name of the RPITIT when looking for
|
||||||
|
// fixes to suggest for the redundant generic below.
|
||||||
|
|
||||||
|
fn test<T: Foo<i32, Assoc = i32>>() {}
|
||||||
|
//~^ ERROR trait takes 0 generic arguments but 1 generic argument was supplied
|
||||||
|
//~| ERROR associated type `Assoc` not found for `Foo`
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,24 @@
|
||||||
|
error[E0107]: trait takes 0 generic arguments but 1 generic argument was supplied
|
||||||
|
--> $DIR/dont-probe-missing-item-name-2.rs:8:12
|
||||||
|
|
|
||||||
|
LL | fn test<T: Foo<i32, Assoc = i32>>() {}
|
||||||
|
| ^^^------------------ help: remove the unnecessary generics
|
||||||
|
| |
|
||||||
|
| expected 0 generic arguments
|
||||||
|
|
|
||||||
|
note: trait defined here, with 0 generic parameters
|
||||||
|
--> $DIR/dont-probe-missing-item-name-2.rs:1:7
|
||||||
|
|
|
||||||
|
LL | trait Foo {
|
||||||
|
| ^^^
|
||||||
|
|
||||||
|
error[E0220]: associated type `Assoc` not found for `Foo`
|
||||||
|
--> $DIR/dont-probe-missing-item-name-2.rs:8:21
|
||||||
|
|
|
||||||
|
LL | fn test<T: Foo<i32, Assoc = i32>>() {}
|
||||||
|
| ^^^^^ associated type `Assoc` not found
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0107, E0220.
|
||||||
|
For more information about an error, try `rustc --explain E0107`.
|
|
@ -0,0 +1,11 @@
|
||||||
|
trait Trait {
|
||||||
|
fn method() -> impl Sized;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that we don't try to probe the name of the RPITIT when looking for
|
||||||
|
// fixes to suggest for the missing associated type's trait path below.
|
||||||
|
|
||||||
|
fn foo() -> i32::Assoc {}
|
||||||
|
//~^ ERROR ambiguous associated type
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,15 @@
|
||||||
|
error[E0223]: ambiguous associated type
|
||||||
|
--> $DIR/dont-probe-missing-item-name-3.rs:8:13
|
||||||
|
|
|
||||||
|
LL | fn foo() -> i32::Assoc {}
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: if there were a trait named `Example` with associated type `Assoc` implemented for `i32`, you could use the fully-qualified path
|
||||||
|
|
|
||||||
|
LL - fn foo() -> i32::Assoc {}
|
||||||
|
LL + fn foo() -> <i32 as Example>::Assoc {}
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0223`.
|
Loading…
Add table
Add a link
Reference in a new issue