Unnamed repository; edit this file 'description' to name the repository.
fix const generic panic
hkalbasi 2022-03-16
parent b301b04 · commit 1f3d187
-rw-r--r--crates/hir_ty/src/infer/expr.rs17
-rw-r--r--crates/hir_ty/src/tests/regression.rs23
2 files changed, 37 insertions, 3 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
index e78a6377e5..ebbce33e01 100644
--- a/crates/hir_ty/src/infer/expr.rs
+++ b/crates/hir_ty/src/infer/expr.rs
@@ -1088,9 +1088,20 @@ impl<'a> InferenceContext<'a> {
}
}
};
- let supplied_params = substs.len();
- for _ in supplied_params..total_len {
- substs.push(GenericArgData::Ty(self.table.new_type_var()).intern(Interner));
+ for (id, data) in def_generics.iter().skip(substs.len()) {
+ match data {
+ TypeOrConstParamData::TypeParamData(_) => {
+ substs.push(GenericArgData::Ty(self.table.new_type_var()).intern(Interner))
+ }
+ TypeOrConstParamData::ConstParamData(_) => {
+ substs.push(
+ GenericArgData::Const(self.table.new_const_var(
+ self.db.const_param_ty(ConstParamId::from_unchecked(id)),
+ ))
+ .intern(Interner),
+ )
+ }
+ }
}
assert_eq!(substs.len(), total_len);
Substitution::from_iter(Interner, substs)
diff --git a/crates/hir_ty/src/tests/regression.rs b/crates/hir_ty/src/tests/regression.rs
index 4a65b927ba..63faecbfaf 100644
--- a/crates/hir_ty/src/tests/regression.rs
+++ b/crates/hir_ty/src/tests/regression.rs
@@ -1431,3 +1431,26 @@ fn nalgebra_factorial() {
"#,
)
}
+
+#[test]
+fn regression_11688_1() {
+ check_no_mismatches(
+ r#"
+ pub struct Buffer<T>(T);
+ type Writer = Buffer<u8>;
+ impl<T> Buffer<T> {
+ fn extend_from_array<const N: usize>(&mut self, xs: &[T; N]) {
+ loop {}
+ }
+ }
+ trait Encode<S> {
+ fn encode(self, w: &mut Writer, s: &mut S);
+ }
+ impl<S> Encode<S> for u8 {
+ fn encode(self, w: &mut Writer, _: &mut S) {
+ w.extend_from_array(&self.to_le_bytes());
+ }
+ }
+ "#,
+ );
+}