mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-04 11:34:51 +00:00
Merge pull request #19738 from ChayimFriedman2/weird-gats
fix: Don't panic on some weird code
This commit is contained in:
commit
debaef80be
@ -232,6 +232,14 @@ pub(super) fn lower_path(
|
|||||||
.with_borrow_mut(|map| map.extend(ast_segments.into_iter().zip(ast_segments_offset..)));
|
.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));
|
let mod_path = Interned::new(ModPath::from_segments(kind, segments));
|
||||||
if type_anchor.is_none() && generic_args.is_empty() {
|
if type_anchor.is_none() && generic_args.is_empty() {
|
||||||
return Some(Path::BarePath(mod_path));
|
return Some(Path::BarePath(mod_path));
|
||||||
|
@ -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}>
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user