Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/lower/tests.rs')
-rw-r--r--crates/hir-ty/src/mir/lower/tests.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/crates/hir-ty/src/mir/lower/tests.rs b/crates/hir-ty/src/mir/lower/tests.rs
index 357f617a21..73399dab7f 100644
--- a/crates/hir-ty/src/mir/lower/tests.rs
+++ b/crates/hir-ty/src/mir/lower/tests.rs
@@ -1,3 +1,4 @@
+use hir_def::DefWithBodyId;
use test_fixture::WithFixture;
use crate::{db::HirDatabase, setup_tracing, test_db::TestDB};
@@ -49,3 +50,61 @@ fn foo() {
"#,
);
}
+
+fn check_borrowck(#[rust_analyzer::rust_fixture] ra_fixture: &str) {
+ let _tracing = setup_tracing();
+ let (db, file_ids) = TestDB::with_many_files(ra_fixture);
+ crate::attach_db(&db, || {
+ let file_id = *file_ids.last().unwrap();
+ let module_id = db.module_for_file(file_id.file_id(&db));
+ let def_map = module_id.def_map(&db);
+ let scope = &def_map[module_id].scope;
+
+ let mut bodies: Vec<DefWithBodyId> = Vec::new();
+
+ for decl in scope.declarations() {
+ if let hir_def::ModuleDefId::FunctionId(f) = decl {
+ bodies.push(f.into());
+ }
+ }
+
+ for impl_id in scope.impls() {
+ let impl_items = impl_id.impl_items(&db);
+ for (_, item) in impl_items.items.iter() {
+ if let hir_def::AssocItemId::FunctionId(f) = item {
+ bodies.push((*f).into());
+ }
+ }
+ }
+
+ for body in bodies {
+ let _ = db.borrowck(body);
+ }
+ })
+}
+
+#[test]
+fn regression_21173_const_generic_impl_with_assoc_type() {
+ check_borrowck(
+ r#"
+pub trait Tr {
+ type Assoc;
+ fn f(&self, handle: Self::Assoc) -> i32;
+}
+
+pub struct ConstGeneric<const N: usize>;
+
+impl<const N: usize> Tr for &ConstGeneric<N> {
+ type Assoc = AssocTy;
+
+ fn f(&self, a: Self::Assoc) -> i32 {
+ a.x
+ }
+}
+
+pub struct AssocTy {
+ x: i32,
+}
+ "#,
+ );
+}