]> git.proxmox.com Git - rustc.git/blame - src/tools/clippy/tests/ui/uninit.rs
New upstream version 1.71.1+dfsg1
[rustc.git] / src / tools / clippy / tests / ui / uninit.rs
CommitLineData
f20569fa 1#![feature(stmt_expr_attributes)]
f2b60f7d 2#![allow(clippy::let_unit_value, invalid_value)]
f20569fa 3
353b0b11
FG
4use std::mem::MaybeUninit;
5
6union MyOwnMaybeUninit {
7 value: u8,
8 uninit: (),
9}
f20569fa
XL
10
11fn main() {
12 let _: usize = unsafe { MaybeUninit::uninit().assume_init() };
13
353b0b11 14 // This is OK, because ZSTs do not contain data.
f20569fa
XL
15 let _: () = unsafe { MaybeUninit::uninit().assume_init() };
16
17 // This is OK, because `MaybeUninit` allows uninitialized data.
18 let _: MaybeUninit<usize> = unsafe { MaybeUninit::uninit().assume_init() };
19
49aad941 20 // This is OK, because all constituent types are uninit-compatible.
f20569fa
XL
21 let _: (MaybeUninit<usize>, MaybeUninit<bool>) = unsafe { MaybeUninit::uninit().assume_init() };
22
49aad941 23 // This is OK, because all constituent types are uninit-compatible.
f20569fa 24 let _: (MaybeUninit<usize>, [MaybeUninit<bool>; 2]) = unsafe { MaybeUninit::uninit().assume_init() };
cdc7bbd5 25
353b0b11
FG
26 // This is OK, because our own MaybeUninit is just as fine as the one from core.
27 let _: MyOwnMaybeUninit = unsafe { MaybeUninit::uninit().assume_init() };
28
29 // This is OK, because empty arrays don't contain data.
30 let _: [u8; 0] = unsafe { MaybeUninit::uninit().assume_init() };
31
cdc7bbd5 32 // Was a false negative.
353b0b11
FG
33 let _: usize = unsafe { MaybeUninit::uninit().assume_init() };
34
35 polymorphic::<()>();
36 polymorphic_maybe_uninit_array::<10>();
37 polymorphic_maybe_uninit::<u8>();
38
39 fn polymorphic<T>() {
40 // We are conservative around polymorphic types.
41 let _: T = unsafe { MaybeUninit::uninit().assume_init() };
42 }
43
44 fn polymorphic_maybe_uninit_array<const N: usize>() {
45 // While the type is polymorphic, MaybeUninit<u8> is not.
46 let _: [MaybeUninit<u8>; N] = unsafe { MaybeUninit::uninit().assume_init() };
47 }
48
49 fn polymorphic_maybe_uninit<T>() {
50 // The entire type is polymorphic, but it's wrapped in a MaybeUninit.
51 let _: MaybeUninit<T> = unsafe { MaybeUninit::uninit().assume_init() };
52 }
f20569fa 53}