Auto merge of #12781 - iDawer:hir_display.stack_overflow, r=lnicola

fix: Stack overflows and wrong type inference of associated type shorthands

This fixes `generic_predicates_for_param_query` comparing local IDs that belong to different definitions.

As the query is used in multiple places this fix affects various r-a features when an associated type shorthand and `impl Trait` involved. Notably inference, goto, completion, hover.

Fixes #12484
This commit is contained in:
bors 2022-07-17 11:01:15 +00:00
commit 667fd25164
3 changed files with 42 additions and 2 deletions

View File

@ -1161,8 +1161,9 @@ pub(crate) fn generic_predicates_for_param_query(
return false; return false;
} }
} }
WherePredicateTypeTarget::TypeOrConstParam(local_id) => { &WherePredicateTypeTarget::TypeOrConstParam(local_id) => {
if *local_id != param_id.local_id { let target_id = TypeOrConstParamId { parent: def, local_id };
if target_id != param_id {
return false; return false;
} }
} }

View File

@ -466,6 +466,23 @@ fn test<T: Iterable>() {
); );
} }
#[test]
fn associated_type_shorthand_from_self_issue_12484() {
check_types(
r#"
trait Bar {
type A;
}
trait Foo {
type A;
fn test(a: Self::A, _: impl Bar) {
a;
//^ Foo::A<Self>
}
}"#,
);
}
#[test] #[test]
fn infer_associated_type_bound() { fn infer_associated_type_bound() {
check_types( check_types(

View File

@ -918,4 +918,26 @@ fn main() {
", ",
) )
} }
#[test]
fn issue_12484() {
check(
r#"
//- minicore: sized
trait SizeUser {
type Size;
}
trait Closure: SizeUser {}
trait Encrypt: SizeUser {
fn encrypt(self, _: impl Closure<Size = Self::Size>);
}
fn test(thing: impl Encrypt) {
thing.$0;
}
"#,
expect![[r#"
me encrypt() (as Encrypt) fn(self, impl Closure<Size = <Self as SizeUser>::Size>)
"#]],
)
}
} }