about summary refs log tree commit diff
diff options
context:
space:
mode:
authorhkalbasi <hamidrezakalbasi@protonmail.com>2022-03-15 22:34:05 +0330
committerhkalbasi <hamidrezakalbasi@protonmail.com>2022-03-15 22:34:05 +0330
commit1f3d18718cd03c57c829b0c523981be25f7595e5 (patch)
tree67794f9d6e68611d1dce1eeae61cbad705efc782
parentb301b040f5781a9083348936369a01c37138756f (diff)
downloadrust-1f3d18718cd03c57c829b0c523981be25f7595e5.tar.gz
rust-1f3d18718cd03c57c829b0c523981be25f7595e5.zip
fix const generic panic
-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 e78a6377e5e..ebbce33e011 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 4a65b927ba9..63faecbfafa 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());
+            }
+        }
+        "#,
+    );
+}