mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
645c0fddd2
Previously, it was only put on scalars with range validity invariants like bool, was uninit was obviously invalid for those. Since then, we have normatively declared all uninit primitives to be undefined behavior and can therefore put `noundef` on them. The remaining concern was the `mem::uninitialized` function, which cause quite a lot of UB in the older parts of the ecosystem. This function now doesn't return uninit values anymore, making users of it safe from this change. The only real sources of UB where people could encounter uninit primitives are `MaybeUninit::uninit().assume_init()`, which has always be clear in the docs about being UB and from heap allocations (like reading from the spare capacity of a vec. This is hopefully rare enough to not break anything.
37 lines
1.5 KiB
Rust
37 lines
1.5 KiB
Rust
// ignore-emscripten
|
|
// compile-flags: -C no-prepopulate-passes
|
|
|
|
// Test that tuples get optimized layout, in particular with a ZST in the last field (#63244)
|
|
|
|
#![crate_type="lib"]
|
|
|
|
type ScalarZstLast = (u128, ());
|
|
// CHECK: define noundef i128 @test_ScalarZstLast(i128 noundef %_1)
|
|
#[no_mangle]
|
|
pub fn test_ScalarZstLast(_: ScalarZstLast) -> ScalarZstLast { loop {} }
|
|
|
|
type ScalarZstFirst = ((), u128);
|
|
// CHECK: define noundef i128 @test_ScalarZstFirst(i128 noundef %_1)
|
|
#[no_mangle]
|
|
pub fn test_ScalarZstFirst(_: ScalarZstFirst) -> ScalarZstFirst { loop {} }
|
|
|
|
type ScalarPairZstLast = (u8, u128, ());
|
|
// CHECK: define { i128, i8 } @test_ScalarPairZstLast(i128 noundef %_1.0, i8 noundef %_1.1)
|
|
#[no_mangle]
|
|
pub fn test_ScalarPairZstLast(_: ScalarPairZstLast) -> ScalarPairZstLast { loop {} }
|
|
|
|
type ScalarPairZstFirst = ((), u8, u128);
|
|
// CHECK: define { i8, i128 } @test_ScalarPairZstFirst(i8 noundef %_1.0, i128 noundef %_1.1)
|
|
#[no_mangle]
|
|
pub fn test_ScalarPairZstFirst(_: ScalarPairZstFirst) -> ScalarPairZstFirst { loop {} }
|
|
|
|
type ScalarPairLotsOfZsts = ((), u8, (), u128, ());
|
|
// CHECK: define { i128, i8 } @test_ScalarPairLotsOfZsts(i128 noundef %_1.0, i8 noundef %_1.1)
|
|
#[no_mangle]
|
|
pub fn test_ScalarPairLotsOfZsts(_: ScalarPairLotsOfZsts) -> ScalarPairLotsOfZsts { loop {} }
|
|
|
|
type ScalarPairLottaNesting = (((), ((), u8, (), u128, ())), ());
|
|
// CHECK: define { i128, i8 } @test_ScalarPairLottaNesting(i128 noundef %_1.0, i8 noundef %_1.1)
|
|
#[no_mangle]
|
|
pub fn test_ScalarPairLottaNesting(_: ScalarPairLottaNesting) -> ScalarPairLottaNesting { loop {} }
|