[len_without_is_empty]: follow type alias

This commit is contained in:
y21 2023-09-02 21:55:44 +02:00
parent b9906aca5a
commit 26c0f97579
3 changed files with 38 additions and 1 deletions

View file

@ -424,6 +424,14 @@ fn check_for_is_empty(
item_name: Symbol, item_name: Symbol,
item_kind: &str, item_kind: &str,
) { ) {
// Implementor may be a type alias, in which case we need to get the `DefId` of the aliased type to
// find the correct inherent impls.
let impl_ty = if let Some(adt) = cx.tcx.type_of(impl_ty).skip_binder().ty_adt_def() {
adt.did()
} else {
return;
};
let is_empty = Symbol::intern("is_empty"); let is_empty = Symbol::intern("is_empty");
let is_empty = cx let is_empty = cx
.tcx .tcx

View file

@ -436,4 +436,27 @@ impl DifferingErrors {
} }
} }
// Issue #11165
pub struct Aliased1;
pub type Alias1 = Aliased1;
impl Alias1 {
pub fn len(&self) -> usize {
todo!()
}
pub fn is_empty(&self) -> bool {
todo!()
}
}
pub struct Aliased2;
pub type Alias2 = Aliased2;
impl Alias2 {
pub fn len(&self) -> usize {
//~^ ERROR: type `Alias2` has a public `len` method, but no `is_empty` method
todo!()
}
}
fn main() {} fn main() {}

View file

@ -139,5 +139,11 @@ error: struct `AsyncResultLenWithoutIsEmpty` has a public `len` method, but no `
LL | pub async fn len(&self) -> Result<usize, ()> { LL | pub async fn len(&self) -> Result<usize, ()> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 15 previous errors error: type `Alias2` has a public `len` method, but no `is_empty` method
--> $DIR/len_without_is_empty.rs:456:5
|
LL | pub fn len(&self) -> usize {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 16 previous errors