Unnamed repository; edit this file 'description' to name the repository.
Insert type vars and normalize for the type of a used `static`
They have their own special path, so they slipped through.
Chayim Refael Friedman 3 months ago
parent 080e703 · commit 2e0dcb9
-rw-r--r--crates/hir-ty/src/infer/path.rs1
-rw-r--r--crates/hir-ty/src/tests/simple.rs43
2 files changed, 44 insertions, 0 deletions
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs
index b11650bbcd..ef1a610a32 100644
--- a/crates/hir-ty/src/infer/path.rs
+++ b/crates/hir-ty/src/infer/path.rs
@@ -93,6 +93,7 @@ impl<'db> InferenceContext<'_, 'db> {
if let GenericDefId::StaticId(_) = generic_def {
// `Static` is the kind of item that can never be generic currently. We can just skip the binders to get its type.
let ty = self.db.value_ty(value_def)?.skip_binder();
+ let ty = self.process_remote_user_written_ty(ty);
return Some(ValuePathResolution::NonGeneric(ty));
};
diff --git a/crates/hir-ty/src/tests/simple.rs b/crates/hir-ty/src/tests/simple.rs
index 28759bcbae..d2a4149bc6 100644
--- a/crates/hir-ty/src/tests/simple.rs
+++ b/crates/hir-ty/src/tests/simple.rs
@@ -3997,3 +3997,46 @@ extern "C" fn foo() -> ! {
"#,
);
}
+
+#[test]
+fn regression_21478() {
+ check_infer(
+ r#"
+//- minicore: unsize, coerce_unsized
+struct LazyLock<T>(T);
+
+impl<T> LazyLock<T> {
+ const fn new() -> Self {
+ loop {}
+ }
+
+ fn force(this: &Self) -> &T {
+ loop {}
+ }
+}
+
+static VALUES_LAZY_LOCK: LazyLock<[u32; { 0 }]> = LazyLock::new();
+
+fn foo() {
+ let _ = LazyLock::force(&VALUES_LAZY_LOCK);
+}
+ "#,
+ expect![[r#"
+ 73..96 '{ ... }': LazyLock<T>
+ 83..90 'loop {}': !
+ 88..90 '{}': ()
+ 111..115 'this': &'? LazyLock<T>
+ 130..153 '{ ... }': &'? T
+ 140..147 'loop {}': !
+ 145..147 '{}': ()
+ 207..220 'LazyLock::new': fn new<[u32; _]>() -> LazyLock<[u32; _]>
+ 207..222 'LazyLock::new()': LazyLock<[u32; _]>
+ 234..285 '{ ...CK); }': ()
+ 244..245 '_': &'? [u32; _]
+ 248..263 'LazyLock::force': fn force<[u32; _]>(&'? LazyLock<[u32; _]>) -> &'? [u32; _]
+ 248..282 'LazyLo..._LOCK)': &'? [u32; _]
+ 264..281 '&VALUE...Y_LOCK': &'? LazyLock<[u32; _]>
+ 265..281 'VALUES...Y_LOCK': LazyLock<[u32; _]>
+ "#]],
+ );
+}