Merge pull request #19738 from ChayimFriedman2/weird-gats

fix: Don't panic on some weird code
This commit is contained in:
Lukas Wirth 2025-05-06 09:05:19 +00:00 committed by GitHub
commit debaef80be
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 0 deletions

View File

@ -232,6 +232,14 @@ pub(super) fn lower_path(
.with_borrow_mut(|map| map.extend(ast_segments.into_iter().zip(ast_segments_offset..)));
}
if let Some(last_segment_args @ Some(GenericArgs { has_self_type: true, .. })) =
generic_args.last_mut()
{
// Well-formed code cannot have `<T as Trait>` without an associated item after,
// and this causes panics in hir-ty lowering.
*last_segment_args = None;
}
let mod_path = Interned::new(ModPath::from_segments(kind, segments));
if type_anchor.is_none() && generic_args.is_empty() {
return Some(Path::BarePath(mod_path));

View File

@ -3902,3 +3902,27 @@ fn main() {
"#]],
);
}
#[test]
fn regression_19734() {
check_infer(
r#"
trait Foo {
type Gat<'o>;
}
trait Bar {
fn baz() -> <Self::Xyz as Foo::Gat<'_>>;
}
fn foo<T: Bar>() {
T::baz();
}
"#,
expect![[r#"
110..127 '{ ...z(); }': ()
116..122 'T::baz': fn baz<T>() -> <{unknown} as Foo>::Gat<'?>
116..124 'T::baz()': Foo::Gat<'?, {unknown}>
"#]],
);
}