Unnamed repository; edit this file 'description' to name the repository.
Don't panic on some weird code
Chayim Refael Friedman 12 months ago
parent d7e977a · commit 3b3e892
-rw-r--r--crates/hir-def/src/expr_store/lower/path.rs8
-rw-r--r--crates/hir-ty/src/tests/simple.rs24
2 files changed, 32 insertions, 0 deletions
diff --git a/crates/hir-def/src/expr_store/lower/path.rs b/crates/hir-def/src/expr_store/lower/path.rs
index 629d1f2ada..be006c98a5 100644
--- a/crates/hir-def/src/expr_store/lower/path.rs
+++ b/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/crates/hir-ty/src/tests/simple.rs b/crates/hir-ty/src/tests/simple.rs
index eeebe38f18..08127eeb46 100644
--- a/crates/hir-ty/src/tests/simple.rs
+++ b/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}>
+ "#]],
+ );
+}