Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/invalid_cast.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/invalid_cast.rs46
1 files changed, 45 insertions, 1 deletions
diff --git a/crates/ide-diagnostics/src/handlers/invalid_cast.rs b/crates/ide-diagnostics/src/handlers/invalid_cast.rs
index 82cd1f2fde..b56255b1fd 100644
--- a/crates/ide-diagnostics/src/handlers/invalid_cast.rs
+++ b/crates/ide-diagnostics/src/handlers/invalid_cast.rs
@@ -440,8 +440,9 @@ fn main() {
q as *const [i32];
//^^^^^^^^^^^^^^^^^ error: cannot cast thin pointer `*const i32` to fat pointer `*const [i32]`
+ // FIXME: This should emit diagnostics but disabled to prevent many false positives
let t: *mut (dyn Trait + 'static) = 0 as *mut _;
- //^^^^^^^^^^^ error: cannot cast `usize` to a fat pointer `*mut _`
+
let mut fail: *const str = 0 as *const str;
//^^^^^^^^^^^^^^^ error: cannot cast `usize` to a fat pointer `*const str`
let mut fail2: *const str = 0isize as *const str;
@@ -1164,4 +1165,47 @@ fn test(ptr: *mut [u8]) -> *mut ZerocopyKnownLayoutMaybeUninit {
"#,
);
}
+
+ #[test]
+ fn regression_19431() {
+ check_diagnostics(
+ r#"
+//- minicore: coerce_unsized
+struct Dst([u8]);
+
+struct Struct {
+ body: Dst,
+}
+
+trait Field {
+ type Type: ?Sized;
+}
+
+impl Field for Struct {
+ type Type = Dst;
+}
+
+trait KnownLayout {
+ type MaybeUninit: ?Sized;
+ type PointerMetadata;
+}
+
+impl<T> KnownLayout for [T] {
+ type MaybeUninit = [T];
+ type PointerMetadata = usize;
+}
+
+impl KnownLayout for Dst {
+ type MaybeUninit = Dst;
+ type PointerMetadata = <[u8] as KnownLayout>::PointerMetadata;
+}
+
+struct ZerocopyKnownLayoutMaybeUninit(<<Struct as Field>::Type as KnownLayout>::MaybeUninit);
+
+fn test(ptr: *mut ZerocopyKnownLayoutMaybeUninit) -> *mut <<Struct as Field>::Type as KnownLayout>::MaybeUninit {
+ ptr as *mut _
+}
+"#,
+ );
+ }
}