]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/tests/ui/cast_alignment.rs
Auto merge of #96659 - thatzopoulos:issue-90679-fix, r=Mark-Simulacrum
[rust.git] / src / tools / clippy / tests / ui / cast_alignment.rs
1 //! Test casts for alignment issues
2
3 #![feature(rustc_private)]
4 #![feature(core_intrinsics)]
5 extern crate libc;
6
7 #[warn(clippy::cast_ptr_alignment)]
8 #[allow(
9     clippy::no_effect,
10     clippy::unnecessary_operation,
11     clippy::cast_lossless,
12     clippy::borrow_as_ptr
13 )]
14
15 fn main() {
16     /* These should be warned against */
17
18     // cast to more-strictly-aligned type
19     (&1u8 as *const u8) as *const u16;
20     (&mut 1u8 as *mut u8) as *mut u16;
21
22     // cast to more-strictly-aligned type, but with the `pointer::cast` function.
23     (&1u8 as *const u8).cast::<u16>();
24     (&mut 1u8 as *mut u8).cast::<u16>();
25
26     /* These should be ok */
27
28     // not a pointer type
29     1u8 as u16;
30     // cast to less-strictly-aligned type
31     (&1u16 as *const u16) as *const u8;
32     (&mut 1u16 as *mut u16) as *mut u8;
33     // For c_void, we should trust the user. See #2677
34     (&1u32 as *const u32 as *const std::os::raw::c_void) as *const u32;
35     (&1u32 as *const u32 as *const libc::c_void) as *const u32;
36     // For ZST, we should trust the user. See #4256
37     (&1u32 as *const u32 as *const ()) as *const u32;
38
39     // Issue #2881
40     let mut data = [0u8, 0u8];
41     unsafe {
42         let ptr = &data as *const [u8; 2] as *const u8;
43         let _ = (ptr as *const u16).read_unaligned();
44         let _ = core::ptr::read_unaligned(ptr as *const u16);
45         let _ = core::intrinsics::unaligned_volatile_load(ptr as *const u16);
46         let ptr = &mut data as *mut [u8; 2] as *mut u8;
47         (ptr as *mut u16).write_unaligned(0);
48         core::ptr::write_unaligned(ptr as *mut u16, 0);
49         core::intrinsics::unaligned_volatile_store(ptr as *mut u16, 0);
50     }
51 }