Fix panic with impl trait associated types in where clause

This commit is contained in:
Jesse Bakker 2024-03-13 17:59:27 +01:00
parent a2e274142f
commit 95828850b2
2 changed files with 40 additions and 2 deletions

View file

@ -1107,8 +1107,12 @@ impl<'a> TyLoweringContext<'a> {
binding.type_ref.as_ref().map_or(0, |_| 1) + binding.bounds.len(),
);
if let Some(type_ref) = &binding.type_ref {
if let (TypeRef::ImplTrait(bounds), ImplTraitLoweringState::Disallowed) =
(type_ref, &self.impl_trait_mode)
if let (
TypeRef::ImplTrait(bounds),
ImplTraitLoweringState::Param(_)
| ImplTraitLoweringState::Variable(_)
| ImplTraitLoweringState::Disallowed,
) = (type_ref, &self.impl_trait_mode)
{
for bound in bounds {
predicates.extend(

View file

@ -1278,6 +1278,40 @@ fn bar() {
);
}
#[test]
fn argument_assoc_impl_trait() {
check_infer(
r#"
trait Outer {
type Item;
}
trait Inner { }
fn foo<T: Outer<Item = impl Inner>>(baz: T) {
}
impl Outer for usize {
type Item = usize;
}
impl Inner for usize {}
fn main() {
foo(2);
}
"#,
expect![[r#"
85..88 'baz': T
93..96 '{ }': ()
182..197 '{ foo(2); }': ()
188..191 'foo': fn foo<usize>(usize)
188..194 'foo(2)': ()
192..193 '2': usize
"#]],
);
}
#[test]
fn simple_return_pos_impl_trait() {
cov_mark::check!(lower_rpit);