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:
commit
667fd25164
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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>)
|
||||||
|
"#]],
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user