]> git.lizzy.rs Git - rust.git/commitdiff
Make use of `ptr::null(_mut)` instead of casting zero
authorLzu Tao <taolzu@gmail.com>
Mon, 17 Jun 2019 10:52:37 +0000 (10:52 +0000)
committerLzu Tao <taolzu@gmail.com>
Mon, 17 Jun 2019 10:52:46 +0000 (10:52 +0000)
33 files changed:
src/bootstrap/job.rs
src/bootstrap/util.rs
src/libarena/lib.rs
src/libpanic_unwind/dummy.rs
src/libpanic_unwind/seh.rs
src/librustc_errors/lock.rs
src/librustc_metadata/dynamic_lib.rs
src/librustc_typeck/error_codes.rs
src/libstd/sys/wasi/args.rs
src/libstd/sys/wasm/thread_local_atomics.rs
src/test/run-make-fulldeps/alloc-extern-crates/fakealloc.rs
src/test/run-pass/cast.rs
src/test/run-pass/cleanup-shortcircuit.rs
src/test/run-pass/consts/const-block.rs
src/test/run-pass/issues/issue-13259-windows-tcb-trash.rs
src/test/run-pass/issues/issue-19001.rs
src/test/run-pass/issues/issue-39367.rs
src/test/run-pass/issues/issue-46069.rs
src/test/run-pass/structs-enums/enum-null-pointer-opt.rs
src/test/ui/casts-issue-46365.rs
src/test/ui/consts/const-eval/ice-generic-assoc-const.rs
src/test/ui/consts/min_const_fn/min_const_fn.rs
src/test/ui/consts/min_const_fn/min_const_fn_unsafe.rs
src/test/ui/derived-errors/issue-31997.rs
src/test/ui/derived-errors/issue-31997.stderr
src/test/ui/error-codes/E0605.rs
src/test/ui/error-codes/E0607.rs
src/test/ui/error-festival.rs
src/test/ui/issues/issue-17458.rs
src/test/ui/issues/issue-17458.stderr
src/test/ui/issues/issue-20801.rs
src/test/ui/issues/issue-22034.rs
src/test/ui/mismatched_types/cast-rfc0401.rs

index df492e0fdfd1c82b7224dfd7056c2db60f31c471..6867d62a480bd2ba57a5a08767f784ad1266c423 100644 (file)
@@ -32,6 +32,7 @@
 use std::env;
 use std::io;
 use std::mem;
+use std::ptr;
 use crate::Build;
 
 type HANDLE = *mut u8;
@@ -118,8 +119,8 @@ pub unsafe fn setup(build: &mut Build) {
     SetErrorMode(mode & !SEM_NOGPFAULTERRORBOX);
 
     // Create a new job object for us to use
-    let job = CreateJobObjectW(0 as *mut _, 0 as *const _);
-    assert!(job != 0 as *mut _, "{}", io::Error::last_os_error());
+    let job = CreateJobObjectW(ptr::null_mut(), ptr::null());
+    assert!(!job.is_null(), "{}", io::Error::last_os_error());
 
     // Indicate that when all handles to the job object are gone that all
     // process in the object should be killed. Note that this includes our
@@ -166,8 +167,8 @@ pub unsafe fn setup(build: &mut Build) {
     };
 
     let parent = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid.parse().unwrap());
-    assert!(parent != 0 as *mut _, "{}", io::Error::last_os_error());
-    let mut parent_handle = 0 as *mut _;
+    assert!(!parent.is_null(), "{}", io::Error::last_os_error());
+    let mut parent_handle = ptr::null_mut();
     let r = DuplicateHandle(GetCurrentProcess(), job,
                             parent, &mut parent_handle,
                             0, FALSE, DUPLICATE_SAME_ACCESS);
index 9f684678bb060be35fbfde61d36a04adafec9374..47f5edd15631a36aec6c3ff21ae95c174c988a82 100644 (file)
@@ -209,7 +209,7 @@ fn to_u16s<S: AsRef<OsStr>>(s: S) -> io::Result<Vec<u16>> {
             let h = CreateFileW(path.as_ptr(),
                                 GENERIC_WRITE,
                                 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
-                                0 as *mut _,
+                                ptr::null_mut(),
                                 OPEN_EXISTING,
                                 FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
                                 ptr::null_mut());
index e2a249c8e61c08c033114ceb20b1c3d99ebd4e44..3d16e335cd8f11870745d0dadf5e30ea2ad91c2d 100644 (file)
@@ -114,8 +114,8 @@ fn default() -> TypedArena<T> {
         TypedArena {
             // We set both `ptr` and `end` to 0 so that the first call to
             // alloc() will trigger a grow().
-            ptr: Cell::new(0 as *mut T),
-            end: Cell::new(0 as *mut T),
+            ptr: Cell::new(ptr::null_mut()),
+            end: Cell::new(ptr::null_mut()),
             chunks: RefCell::new(vec![]),
             _own: PhantomData,
         }
@@ -370,8 +370,8 @@ impl Default for DroplessArena {
     #[inline]
     fn default() -> DroplessArena {
         DroplessArena {
-            ptr: Cell::new(0 as *mut u8),
-            end: Cell::new(0 as *mut u8),
+            ptr: Cell::new(ptr::null_mut()),
+            end: Cell::new(ptr::null_mut()),
             chunks: Default::default(),
         }
     }
index 3a00d6376658c1a64751ddd349181ff7325ab23c..8675632638712aa2593f77f1b1bcba0621316680 100644 (file)
@@ -7,7 +7,7 @@
 use core::intrinsics;
 
 pub fn payload() -> *mut u8 {
-    0 as *mut u8
+    core::ptr::null_mut()
 }
 
 pub unsafe fn cleanup(_ptr: *mut u8) -> Box<dyn Any + Send> {
index 996fdb931eff2d49000f7d56212adea96c5d0172..809e4619812dec41c90575e81069f039e62e53d4 100644 (file)
@@ -104,7 +104,7 @@ mod imp {
     pub const NAME2: [u8; 7] = [b'.', b'P', b'A', b'X', 0, 0, 0];
 
     macro_rules! ptr {
-        (0) => (0 as *mut u8);
+        (0) => (core::ptr::null_mut());
         ($e:expr) => ($e as *mut u8);
     }
 }
@@ -223,13 +223,13 @@ pub struct _TypeDescriptor {
 #[cfg_attr(not(test), lang = "msvc_try_filter")]
 static mut TYPE_DESCRIPTOR1: _TypeDescriptor = _TypeDescriptor {
     pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _,
-    spare: 0 as *mut _,
+    spare: core::ptr::null_mut(),
     name: imp::NAME1,
 };
 
 static mut TYPE_DESCRIPTOR2: _TypeDescriptor = _TypeDescriptor {
     pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _,
-    spare: 0 as *mut _,
+    spare: core::ptr::null_mut(),
     name: imp::NAME2,
 };
 
index f731791efe6e16344c6d5f11d8acd825f4b753df..25a27d2cbd884d953c3e28e64c7f043d2db5e519 100644 (file)
@@ -64,7 +64,7 @@ fn drop(&mut self) {
         //
         // This will silently create one if it doesn't already exist, or it'll
         // open up a handle to one if it already exists.
-        let mutex = CreateMutexA(0 as *mut _, 0, cname.as_ptr() as *const u8);
+        let mutex = CreateMutexA(std::ptr::null_mut(), 0, cname.as_ptr() as *const u8);
         if mutex.is_null() {
             panic!("failed to create global mutex named `{}`: {}",
                    name,
index 76a9a3405bd813271adbdce8e19506c5724d9351..4c279361ff5e1c657b2781670e53634a948b8e55 100644 (file)
@@ -115,7 +115,7 @@ pub fn check_for_errors_in<T, F>(f: F) -> Result<T, String> where
     {
         use std::sync::{Mutex, Once};
         static INIT: Once = Once::new();
-        static mut LOCK: *mut Mutex<()> = 0 as *mut _;
+        static mut LOCK: *mut Mutex<()> = ptr::null_mut();
         unsafe {
             INIT.call_once(|| {
                 LOCK = Box::into_raw(Box::new(Mutex::new(())));
index 0b618cdf1dbb71d1b2fc67551d59a8615ec0bb78..b5b214d4aff6b9dcc8ad9be89b4d798392f53687 100644 (file)
@@ -3904,7 +3904,7 @@ trait was performed.
 
 // Another example
 
-let v = 0 as *const u8; // So here, `v` is a `*const u8`.
+let v = core::ptr::null::<u8>(); // So here, `v` is a `*const u8`.
 v as &u8; // error: non-primitive cast: `*const u8` as `&u8`
 ```
 
@@ -3914,7 +3914,7 @@ trait was performed.
 let x = 0u8;
 x as u32; // ok!
 
-let v = 0 as *const u8;
+let v = core::ptr::null::<u8>();
 v as *const i8; // ok!
 ```
 
@@ -3954,7 +3954,7 @@ trait was performed.
 Erroneous code example:
 
 ```compile_fail,E0607
-let v = 0 as *const u8;
+let v = core::ptr::null::<u8>();
 v as *const [u8];
 ```
 
index 9c8e59e4fb5e1e47a04c7ef1ecc2193a46c4057e..8b4b354d9fc20ce868be48418e332b3b698018b6 100644 (file)
@@ -32,7 +32,7 @@ fn maybe_args() -> io::Result<Args> {
         let (mut argc, mut argv_buf_size) = (0, 0);
         cvt_wasi(libc::__wasi_args_sizes_get(&mut argc, &mut argv_buf_size))?;
 
-        let mut argc = vec![0 as *mut libc::c_char; argc];
+        let mut argc = vec![core::ptr::null_mut::<libc::c_char>(); argc];
         let mut argv_buf = vec![0; argv_buf_size];
         cvt_wasi(libc::__wasi_args_get(argc.as_mut_ptr(), argv_buf.as_mut_ptr()))?;
 
index b408ad0d5c1f82ca3e6e5b04baff907765530b58..3dc0bb24553fd644450b36c29a148d26a30fdbad 100644 (file)
@@ -11,7 +11,7 @@ struct ThreadControlBlock {
 impl ThreadControlBlock {
     fn new() -> ThreadControlBlock {
         ThreadControlBlock {
-            keys: [0 as *mut u8; MAX_KEYS],
+            keys: [core::ptr::null_mut(); MAX_KEYS],
         }
     }
 
index 625c3afab921cfc12893baca1ca0aee07210536c..d4612c325d5ac66f9077363118c16af3d7fe4208 100644 (file)
@@ -2,14 +2,16 @@
 #![no_std]
 
 #[inline]
-pub unsafe fn allocate(_size: usize, _align: usize) -> *mut u8 { 0 as *mut u8 }
+pub unsafe fn allocate(_size: usize, _align: usize) -> *mut u8 {
+    core::ptr::null_mut()
+}
 
 #[inline]
 pub unsafe fn deallocate(_ptr: *mut u8, _old_size: usize, _align: usize) { }
 
 #[inline]
 pub unsafe fn reallocate(_ptr: *mut u8, _old_size: usize, _size: usize, _align: usize) -> *mut u8 {
-    0 as *mut u8
+    core::ptr::null_mut()
 }
 
 #[inline]
index 37add8446f4003d79ecfbce427113275d578162c..c7977f461dfccf304c899db06262438c198d44af 100644 (file)
@@ -15,5 +15,5 @@ pub fn main() {
     // Test that `_` is correctly inferred.
     let x = &"hello";
     let mut y = x as *const _;
-    y = 0 as *const _;
+    y = core::ptr::null_mut();
 }
index 118fa0083ab47918793b17d00be437a58ac5eaa0..6e67a276d4f1c3bbd4bea49117b767924c029dca 100644 (file)
@@ -16,6 +16,6 @@ pub fn main() {
 
     if args.len() >= 2 && args[1] == "signal" {
         // Raise a segfault.
-        unsafe { *(0 as *mut isize) = 0; }
+        unsafe { *std::ptr::null_mut::<isize>() = 0; }
     }
 }
index 012523a61efcf4e226d4cfa859dc9b0eab1437af..7172a34c8cfeba6a4c5994482251a387fc6252c2 100644 (file)
@@ -21,7 +21,7 @@ fn foo<T>(a: T) -> T {
 static BLOCK_IMPLICIT_UNIT: () = { };
 static BLOCK_FLOAT: f64 = { 1.0 };
 static BLOCK_ENUM: Option<usize> = { Some(100) };
-static BLOCK_STRUCT: Foo = { Foo { a: 12, b: 0 as *const () } };
+static BLOCK_STRUCT: Foo = { Foo { a: 12, b: std::ptr::null::<()>() } };
 static BLOCK_UNSAFE: usize = unsafe { 1000 };
 
 static BLOCK_FN_INFERRED: fn(usize) -> usize = { foo };
@@ -36,7 +36,7 @@ pub fn main() {
     assert_eq!(BLOCK_IMPLICIT_UNIT, ());
     assert_eq!(BLOCK_FLOAT, 1.0_f64);
     assert_eq!(BLOCK_STRUCT.a, 12);
-    assert_eq!(BLOCK_STRUCT.b, 0 as *const ());
+    assert_eq!(BLOCK_STRUCT.b, std::ptr::null::<()>());
     assert_eq!(BLOCK_ENUM, Some(100));
     assert_eq!(BLOCK_UNSAFE, 1000);
     assert_eq!(BLOCK_FN_INFERRED(300), 300);
index d79d34de571dfa7031689f40daba0f14b7cc065d..740e7780de67a35a6f9e6eff6a0e01c8d67be0e5 100644 (file)
@@ -23,8 +23,8 @@ fn FormatMessageW(flags: DWORD,
     pub fn test() {
         let mut buf: [u16; 50] = [0; 50];
         let ret = unsafe {
-            FormatMessageW(0x1000, 0 as *mut _, 1, 0x400,
-                           buf.as_mut_ptr(), buf.len() as u32, 0 as *const _)
+            FormatMessageW(0x1000, core::ptr::null_mut(), 1, 0x400,
+                           buf.as_mut_ptr(), buf.len() as u32, core::ptr::null())
         };
         // On some 32-bit Windowses (Win7-8 at least) this will panic with segmented
         // stacks taking control of pvArbitrary
index 85f7a84ac295fce8c717f1b014fd1170316564a2..76c380c2fc97e878d92d32af66b140b7b0137795 100644 (file)
@@ -7,5 +7,5 @@ struct Loopy {
 }
 
 fn main() {
-    let _t = Loopy { ptr: 0 as *mut _ };
+    let _t = Loopy { ptr: core::ptr::null_mut() };
 }
index 2e2b480e0660225e07e6764e2108aa41ead777f7..8314be3d14cc5acc242ce9663a5bfd51760bd3eb 100644 (file)
@@ -15,7 +15,7 @@ fn __static_ref_initialize() -> ArenaSet<Vec<u8>> {
         fn require_sync<T: Sync>(_: &T) { }
         unsafe fn __stability() -> &'static ArenaSet<Vec<u8>> {
             use std::mem::transmute;
-            static mut DATA: *const ArenaSet<Vec<u8>> = 0 as *const ArenaSet<Vec<u8>>;
+            static mut DATA: *const ArenaSet<Vec<u8>> = std::ptr::null_mut();
 
             static mut ONCE: Once = Once::new();
             ONCE.call_once(|| {
index fba2a2ebe3b04ffd789a1d60870f1206b6da6bba..1d4f789828d8bd726534258facfee1094b7408e8 100644 (file)
@@ -17,7 +17,7 @@ fn copy_ex() {
 }
 
 fn main() {
-    let _f = 0 as *mut <Fuse<Cloned<Iter<u8>>> as Iterator>::Item;
+    let _f: *mut <Fuse<Cloned<Iter<u8>>> as Iterator>::Item = std::ptr::null_mut();
 
     copy_ex();
 }
index f871c218558603175ec75150d27bf8f54ecea348..32fdbf620a98d0c73d9acaf203eb9b60a7141f7d 100644 (file)
@@ -38,7 +38,7 @@ fn main() {
 
     // The optimization can't apply to raw pointers or unions with a ZST field.
     assert!(size_of::<Option<*const isize>>() != size_of::<*const isize>());
-    assert!(Some(0 as *const isize).is_some()); // Can't collapse None to null
+    assert!(Some(std::ptr::null::<isize>()).is_some()); // Can't collapse None to null
     assert_ne!(size_of::<fn(isize)>(), size_of::<Option<MaybeUninitUnion<fn(isize)>>>());
     assert_ne!(size_of::<&str>(), size_of::<Option<MaybeUninitUnion<&str>>>());
     assert_ne!(size_of::<NonNull<isize>>(), size_of::<Option<MaybeUninitUnion<NonNull<isize>>>>());
index 2e7c26b54e41b93b081b2692b0fd4fcb7bbf886e..3d0fea245c0c2339f07d5db0cd28e694900e2756 100644 (file)
@@ -3,5 +3,5 @@ struct Lorem {
 }
 
 fn main() {
-    let _foo: *mut Lorem = 0 as *mut _; // no error here
+    let _foo: *mut Lorem = core::ptr::null_mut(); // no error here
 }
index e92de84c27984ef521b2d1ac2f22729b04f519c1..2ad1a633d125f18af76f35b09222dbad621ea1b9 100644 (file)
@@ -7,7 +7,7 @@ pub trait Nullable {
 }
 
 impl<T> Nullable for *const T {
-    const NULL: Self = 0 as *const T;
+    const NULL: Self = core::ptr::null::<T>();
 
     fn is_null(&self) -> bool {
         *self == Self::NULL
index 40e7107e4a15e1654309a068a612819d59d0e576..9523fcbfc603f64e3341a3503b388a5cdeb7b2ca 100644 (file)
@@ -69,8 +69,8 @@ const fn i32_ops3(c: i32, d: i32) -> bool { c != d }
 const fn i32_ops4(c: i32, d: i32) -> i32 { c + d }
 const fn char_cast(u: u8) -> char { u as char }
 const unsafe fn ret_i32_no_unsafe() -> i32 { 42 }
-const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { 0 as *const T }
-const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { 0 as *mut T }
+const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { core::ptr::null() }
+const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { core::ptr::null_mut() }
 
 // not ok
 const fn foo11<T: std::fmt::Display>(t: T) -> T { t }
index e25dafa74d7abe588cbd8924216ebdb9c7186701..0152561aefcb2c5fa182a55db1b04ad089c656c6 100644 (file)
@@ -3,8 +3,8 @@
 //------------------------------------------------------------------------------
 
 const unsafe fn ret_i32_no_unsafe() -> i32 { 42 }
-const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { 0 as *const T }
-const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { 0 as *mut T }
+const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { std::ptr::null() }
+const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { std::ptr::null_mut() }
 const fn no_unsafe() { unsafe {} }
 
 const fn call_unsafe_const_fn() -> i32 {
index 025e9100e23601c384ecdcec54c152fd43941da5..cfdee26c5599c48a5020d069c47f29e36ec8a2e3 100644 (file)
@@ -10,7 +10,7 @@ fn closure<F, T>(x: F) -> Result<T, ()>
 }
 
 fn foo() -> Result<(), ()> {
-    try!(closure(|| bar(0 as *mut _))); //~ ERROR cannot find function `bar` in this scope
+    try!(closure(|| bar(core::ptr::null_mut()))); //~ ERROR cannot find function `bar` in this scope
     Ok(())
 }
 
index dbceba046e2ae1353b0fe54073f1806f82ea86b5..e9fe0d3971ee68eb8bfd915dab01e79ac16c878e 100644 (file)
@@ -1,7 +1,7 @@
 error[E0425]: cannot find function `bar` in this scope
   --> $DIR/issue-31997.rs:13:21
    |
-LL |     try!(closure(|| bar(0 as *mut _)));
+LL |     try!(closure(|| bar(core::ptr::null_mut())));
    |                     ^^^ not found in this scope
 
 error: aborting due to previous error
index 0e86e367e8328834103daca8a73f15f0bfa6ab4a..cfbf1aa2bd76530593dfde6fedccd08699df52e5 100644 (file)
@@ -2,6 +2,6 @@ fn main() {
     let x = 0u8;
     x as Vec<u8>; //~ ERROR E0605
 
-    let v = 0 as *const u8;
+    let v = std::ptr::null::<u8>();
     v as &u8; //~ ERROR E0605
 }
index ad9f8709b07f2ab78adede6db4caf4f13889181b..65001c471cb4bc9b92f9fda773dd0a10b575c4ed 100644 (file)
@@ -1,4 +1,4 @@
 fn main() {
-    let v = 0 as *const u8;
+    let v = core::ptr::null::<u8>();
     v as *const [u8]; //~ ERROR E0607
 }
index e462824cded49117f4d8c6da2ec5c97fb0734041..356564e54077a3353aa31a983d3b4b42db5feffa 100644 (file)
@@ -37,7 +37,7 @@ fn main() {
     let y: u32 = x as u32;
     //~^ ERROR E0606
 
-    let v = 0 as *const u8;
+    let v = core::ptr::null::<u8>();
     v as *const [u8];
     //~^ ERROR E0607
 }
index 444e94d829bf8c0f76d08109a2b0138fd2d891bd..d56ffebad7d5aeb339713ebdd6845c376702050d 100644 (file)
@@ -1,4 +1,4 @@
-static X: usize = unsafe { 0 as *const usize as usize };
+static X: usize = unsafe { core::ptr::null::<usize>() as usize };
 //~^ ERROR: casting pointers to integers in statics is unstable
 
 fn main() {
index 69b6ab71e5077b2bf58d6a1cbe30089606d82222..d51d2f50d6faf2ec34b8557bd0e2740de44e9397 100644 (file)
@@ -1,8 +1,8 @@
 error[E0658]: casting pointers to integers in statics is unstable
   --> $DIR/issue-17458.rs:1:28
    |
-LL | static X: usize = unsafe { 0 as *const usize as usize };
-   |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | static X: usize = unsafe { core::ptr::null::<usize>() as usize };
+   |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: for more information, see https://github.com/rust-lang/rust/issues/51910
    = help: add #![feature(const_raw_ptr_to_usize_cast)] to the crate attributes to enable
index 35d6f8c0fae135c13eab3fda8bd174779c09e758..c3f136f2876b699603b37afe9d2f8c1b52299704 100644 (file)
@@ -15,11 +15,11 @@ fn mut_ref() -> &'static mut T {
 }
 
 fn mut_ptr() -> *mut T {
-    unsafe { 0 as *mut T }
+    unsafe { core::ptr::null_mut() }
 }
 
 fn const_ptr() -> *const T {
-    unsafe { 0 as *const T }
+    unsafe { core::ptr::null() }
 }
 
 pub fn main() {
index 508c9c91b04e5f989fed2ddf659f07f7da876163..fab1cdadaf5e1562449fef1146febf6f4c038295 100644 (file)
@@ -3,7 +3,7 @@
 extern crate libc;
 
 fn main() {
-    let ptr: *mut () = 0 as *mut _;
+    let ptr: *mut () = core::ptr::null_mut();
     let _: &mut dyn Fn() = unsafe {
         &mut *(ptr as *mut dyn Fn())
         //~^ ERROR expected a `std::ops::Fn<()>` closure, found `()`
index 2f88c6496c4206f21c690959f31837d6efa2fdef..b8d12fb9809ced8af56340cc997e3c8af0acf420 100644 (file)
@@ -21,9 +21,9 @@ enum E {
 fn main()
 {
     let f: f32 = 1.2;
-    let v = 0 as *const u8;
-    let fat_v : *const [u8] = unsafe { &*(0 as *const [u8; 1])};
-    let fat_sv : *const [i8] = unsafe { &*(0 as *const [i8; 1])};
+    let v = core::ptr::null::<u8>();
+    let fat_v : *const [u8] = unsafe { &*core::ptr::null::<[u8; 1]>()};
+    let fat_sv : *const [i8] = unsafe { &*core::ptr::null::<[i8; 1]>()};
     let foo: &dyn Foo = &f;
 
     let _ = v as &u8; //~ ERROR non-primitive cast