Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/tests/regression/new_solver.rs')
| -rw-r--r-- | crates/hir-ty/src/tests/regression/new_solver.rs | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/crates/hir-ty/src/tests/regression/new_solver.rs b/crates/hir-ty/src/tests/regression/new_solver.rs index fb00a755fa..121e3959ce 100644 --- a/crates/hir-ty/src/tests/regression/new_solver.rs +++ b/crates/hir-ty/src/tests/regression/new_solver.rs @@ -1,6 +1,55 @@ use expect_test::expect; +use hir_def::ModuleDefId; +use rustc_type_ir::inherent::IntoKind as _; +use test_fixture::WithFixture; -use crate::tests::{check_infer, check_no_mismatches, check_types}; +use crate::{ + db::HirDatabase, + next_solver::{DbInterner, RegionKind, TyKind}, + test_db::TestDB, + tests::{check_infer, check_no_mismatches, check_types}, +}; + +#[test] +fn liberating_distinct_late_bound_lifetimes_preserves_identity() { + let (db, file_id) = TestDB::with_single_file( + r#" +fn f<'a, 'b>(x: &'a u8, y: &'b u8) {} +"#, + ); + + crate::attach_db(&db, || { + 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 func = scope + .declarations() + .find_map( + |decl| { + if let ModuleDefId::FunctionId(func) = decl { Some(func) } else { None } + }, + ) + .unwrap(); + let interner = DbInterner::new_with(&db, module_id.krate(&db)); + let sig = db.callable_item_signature(func.into()).instantiate_identity().skip_norm_wip(); + let sig = interner.liberate_late_bound_regions(func.into(), sig); + let inputs = sig.inputs(); + let TyKind::Ref(first_region, _first_ty, _first_mutability) = inputs[0].kind() else { + panic!("expected reference input, got {:?}", inputs[0]); + }; + let TyKind::Ref(second_region, _second_ty, _second_mutability) = inputs[1].kind() else { + panic!("expected reference input, got {:?}", inputs[1]); + }; + let RegionKind::ReLateParam(_first_late_param) = first_region.kind() else { + panic!("expected late parameter region, got {first_region:?}"); + }; + let RegionKind::ReLateParam(_second_late_param) = second_region.kind() else { + panic!("expected late parameter region, got {second_region:?}"); + }; + + assert_ne!(first_region, second_region); + }); +} #[test] fn regression_20365() { |