]> git.proxmox.com Git - rustc.git/blame - src/tools/clippy/tests/ui/uninit.rs
New upstream version 1.74.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() };
781aab86
FG
13 //~^ ERROR: this call for this type may be undefined behavior
14 //~| NOTE: `#[deny(clippy::uninit_assumed_init)]` on by default
f20569fa 15
353b0b11 16 // This is OK, because ZSTs do not contain data.
f20569fa
XL
17 let _: () = unsafe { MaybeUninit::uninit().assume_init() };
18
19 // This is OK, because `MaybeUninit` allows uninitialized data.
20 let _: MaybeUninit<usize> = unsafe { MaybeUninit::uninit().assume_init() };
21
49aad941 22 // This is OK, because all constituent types are uninit-compatible.
f20569fa
XL
23 let _: (MaybeUninit<usize>, MaybeUninit<bool>) = unsafe { MaybeUninit::uninit().assume_init() };
24
49aad941 25 // This is OK, because all constituent types are uninit-compatible.
f20569fa 26 let _: (MaybeUninit<usize>, [MaybeUninit<bool>; 2]) = unsafe { MaybeUninit::uninit().assume_init() };
cdc7bbd5 27
353b0b11
FG
28 // This is OK, because our own MaybeUninit is just as fine as the one from core.
29 let _: MyOwnMaybeUninit = unsafe { MaybeUninit::uninit().assume_init() };
30
31 // This is OK, because empty arrays don't contain data.
32 let _: [u8; 0] = unsafe { MaybeUninit::uninit().assume_init() };
33
cdc7bbd5 34 // Was a false negative.
353b0b11 35 let _: usize = unsafe { MaybeUninit::uninit().assume_init() };
781aab86 36 //~^ ERROR: this call for this type may be undefined behavior
353b0b11
FG
37
38 polymorphic::<()>();
39 polymorphic_maybe_uninit_array::<10>();
40 polymorphic_maybe_uninit::<u8>();
41
42 fn polymorphic<T>() {
43 // We are conservative around polymorphic types.
44 let _: T = unsafe { MaybeUninit::uninit().assume_init() };
781aab86 45 //~^ ERROR: this call for this type may be undefined behavior
353b0b11
FG
46 }
47
48 fn polymorphic_maybe_uninit_array<const N: usize>() {
49 // While the type is polymorphic, MaybeUninit<u8> is not.
50 let _: [MaybeUninit<u8>; N] = unsafe { MaybeUninit::uninit().assume_init() };
51 }
52
53 fn polymorphic_maybe_uninit<T>() {
54 // The entire type is polymorphic, but it's wrapped in a MaybeUninit.
55 let _: MaybeUninit<T> = unsafe { MaybeUninit::uninit().assume_init() };
56 }
f20569fa 57}