diff options
| author | Chayim Refael Friedman <chayimfr@gmail.com> | 2025-05-06 10:54:35 +0300 |
|---|---|---|
| committer | Chayim Refael Friedman <chayimfr@gmail.com> | 2025-05-06 10:54:35 +0300 |
| commit | 1ed416de0388493ed9d604522399af5f9fd4eab6 (patch) | |
| tree | 8b55a4116d8cf3cc6d9ef2dded369f97d72cede7 | |
| parent | 2e7b86d4b66b6c6a1ea39b1ccb97015424553979 (diff) | |
| download | rust-1ed416de0388493ed9d604522399af5f9fd4eab6.tar.gz rust-1ed416de0388493ed9d604522399af5f9fd4eab6.zip | |
Don't panic on some weird code
| -rw-r--r-- | src/tools/rust-analyzer/crates/hir-def/src/expr_store/lower/path.rs | 8 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/crates/hir-ty/src/tests/simple.rs | 24 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-def/src/expr_store/lower/path.rs b/src/tools/rust-analyzer/crates/hir-def/src/expr_store/lower/path.rs index 629d1f2ada7..be006c98a58 100644 --- a/src/tools/rust-analyzer/crates/hir-def/src/expr_store/lower/path.rs +++ b/src/tools/rust-analyzer/crates/hir-def/src/expr_store/lower/path.rs @@ -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)); diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/tests/simple.rs b/src/tools/rust-analyzer/crates/hir-ty/src/tests/simple.rs index eeebe38f182..08127eeb463 100644 --- a/src/tools/rust-analyzer/crates/hir-ty/src/tests/simple.rs +++ b/src/tools/rust-analyzer/crates/hir-ty/src/tests/simple.rs @@ -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}> + "#]], + ); +} |
