diff options
| author | Arvind Mukund <armu30@gmail.com> | 2024-03-09 14:34:08 -0800 |
|---|---|---|
| committer | Arvind Mukund <armu30@gmail.com> | 2024-04-23 21:26:04 -0700 |
| commit | 223d5eb64f492a41801396e34e714a657d020ac6 (patch) | |
| tree | 25cc0688d27e635ea8fd1ee5f1ac287c432590ff | |
| parent | 08b85a1c5381cfc9c62347996b4b5c0316522b60 (diff) | |
| download | rust-223d5eb64f492a41801396e34e714a657d020ac6.tar.gz rust-223d5eb64f492a41801396e34e714a657d020ac6.zip | |
Add tests
Tests both `T` and `E` for niche variant optimization lints
| -rw-r--r-- | tests/ui/lint/lint-ctypes-enum.rs | 144 | ||||
| -rw-r--r-- | tests/ui/lint/lint-ctypes-enum.stderr | 183 |
2 files changed, 270 insertions, 57 deletions
diff --git a/tests/ui/lint/lint-ctypes-enum.rs b/tests/ui/lint/lint-ctypes-enum.rs index c60290f8553..8d60a8dd317 100644 --- a/tests/ui/lint/lint-ctypes-enum.rs +++ b/tests/ui/lint/lint-ctypes-enum.rs @@ -55,38 +55,120 @@ union TransparentUnion<T: Copy> { struct Rust<T>(T); +struct NoField; + +#[repr(transparent)] +struct Field(()); + +#[non_exhaustive] +enum NonExhaustive {} + extern "C" { - fn zf(x: Z); - fn uf(x: U); //~ ERROR `extern` block uses type `U` - fn bf(x: B); //~ ERROR `extern` block uses type `B` - fn tf(x: T); //~ ERROR `extern` block uses type `T` - fn repr_c(x: ReprC); - fn repr_u8(x: U8); - fn repr_isize(x: Isize); - fn option_ref(x: Option<&'static u8>); - fn option_fn(x: Option<extern "C" fn()>); - fn nonnull(x: Option<std::ptr::NonNull<u8>>); - fn unique(x: Option<std::ptr::Unique<u8>>); - fn nonzero_u8(x: Option<num::NonZero<u8>>); - fn nonzero_u16(x: Option<num::NonZero<u16>>); - fn nonzero_u32(x: Option<num::NonZero<u32>>); - fn nonzero_u64(x: Option<num::NonZero<u64>>); - fn nonzero_u128(x: Option<num::NonZero<u128>>); - //~^ ERROR `extern` block uses type `u128` - fn nonzero_usize(x: Option<num::NonZero<usize>>); - fn nonzero_i8(x: Option<num::NonZero<i8>>); - fn nonzero_i16(x: Option<num::NonZero<i16>>); - fn nonzero_i32(x: Option<num::NonZero<i32>>); - fn nonzero_i64(x: Option<num::NonZero<i64>>); - fn nonzero_i128(x: Option<num::NonZero<i128>>); - //~^ ERROR `extern` block uses type `i128` - fn nonzero_isize(x: Option<num::NonZero<isize>>); - fn transparent_struct(x: Option<TransparentStruct<num::NonZero<u8>>>); - fn transparent_enum(x: Option<TransparentEnum<num::NonZero<u8>>>); - fn transparent_union(x: Option<TransparentUnion<num::NonZero<u8>>>); - //~^ ERROR `extern` block uses type - fn repr_rust(x: Option<Rust<num::NonZero<u8>>>); //~ ERROR `extern` block uses type - fn no_result(x: Result<(), num::NonZero<i32>>); //~ ERROR `extern` block uses type + fn zf(x: Z); + fn uf(x: U); //~ ERROR `extern` block uses type `U` + fn bf(x: B); //~ ERROR `extern` block uses type `B` + fn tf(x: T); //~ ERROR `extern` block uses type `T` + fn repr_c(x: ReprC); + fn repr_u8(x: U8); + fn repr_isize(x: Isize); + fn option_ref(x: Option<&'static u8>); + fn option_fn(x: Option<extern "C" fn()>); + fn option_nonnull(x: Option<std::ptr::NonNull<u8>>); + fn option_unique(x: Option<std::ptr::Unique<u8>>); + fn option_nonzero_u8(x: Option<num::NonZero<u8>>); + fn option_nonzero_u16(x: Option<num::NonZero<u16>>); + fn option_nonzero_u32(x: Option<num::NonZero<u32>>); + fn option_nonzero_u64(x: Option<num::NonZero<u64>>); + fn option_nonzero_u128(x: Option<num::NonZero<u128>>); + //~^ ERROR `extern` block uses type `u128` + fn option_nonzero_usize(x: Option<num::NonZero<usize>>); + fn option_nonzero_i8(x: Option<num::NonZero<i8>>); + fn option_nonzero_i16(x: Option<num::NonZero<i16>>); + fn option_nonzero_i32(x: Option<num::NonZero<i32>>); + fn option_nonzero_i64(x: Option<num::NonZero<i64>>); + fn option_nonzero_i128(x: Option<num::NonZero<i128>>); + //~^ ERROR `extern` block uses type `i128` + fn option_nonzero_isize(x: Option<num::NonZero<isize>>); + fn option_transparent_struct(x: Option<TransparentStruct<num::NonZero<u8>>>); + fn option_transparent_enum(x: Option<TransparentEnum<num::NonZero<u8>>>); + fn option_transparent_union(x: Option<TransparentUnion<num::NonZero<u8>>>); + //~^ ERROR `extern` block uses type + fn option_repr_rust(x: Option<Rust<num::NonZero<u8>>>); //~ ERROR `extern` block uses type + + fn result_ref_t(x: Result<&'static u8, ()>); + fn result_fn_t(x: Result<extern "C" fn(), ()>); + fn result_nonnull_t(x: Result<std::ptr::NonNull<u8>, ()>); + fn result_unique_t(x: Result<std::ptr::Unique<u8>, ()>); + fn result_nonzero_u8_t(x: Result<num::NonZero<u8>, ()>); + fn result_nonzero_u16_t(x: Result<num::NonZero<u16>, ()>); + fn result_nonzero_u32_t(x: Result<num::NonZero<u32>, ()>); + fn result_nonzero_u64_t(x: Result<num::NonZero<u64>, ()>); + fn result_nonzero_u128_t(x: Result<num::NonZero<u128>, ()>); + //~^ ERROR `extern` block uses type `u128` + fn result_nonzero_usize_t(x: Result<num::NonZero<usize>, ()>); + fn result_nonzero_i8_t(x: Result<num::NonZero<i8>, ()>); + fn result_nonzero_i16_t(x: Result<num::NonZero<i16>, ()>); + fn result_nonzero_i32_t(x: Result<num::NonZero<i32>, ()>); + fn result_nonzero_i64_t(x: Result<num::NonZero<i64>, ()>); + fn result_nonzero_i128_t(x: Result<num::NonZero<i128>, ()>); + //~^ ERROR `extern` block uses type `i128` + fn result_nonzero_isize_t(x: Result<num::NonZero<isize>, ()>); + fn result_transparent_struct_t(x: Result<TransparentStruct<num::NonZero<u8>>, ()>); + fn result_transparent_enum_t(x: Result<TransparentEnum<num::NonZero<u8>>, ()>); + fn result_transparent_union_t(x: Result<TransparentUnion<num::NonZero<u8>>, ()>); + //~^ ERROR `extern` block uses type + fn result_repr_rust_t(x: Result<Rust<num::NonZero<u8>>, ()>); + //~^ ERROR `extern` block uses type + fn result_phantom_t(x: Result<num::NonZero<u8>, std::marker::PhantomData<()>>); + fn result_1zst_exhaustive_no_variant_t(x: Result<num::NonZero<u8>, Z>); + fn result_1zst_exhaustive_single_variant_t(x: Result<num::NonZero<u8>, U>); + fn result_1zst_exhaustive_multiple_variant_t(x: Result<num::NonZero<u8>, B>); + //~^ ERROR `extern` block uses type + fn result_1zst_non_exhaustive_no_variant_t(x: Result<num::NonZero<u8>, NonExhaustive>); + //~^ ERROR `extern` block uses type + fn result_1zst_exhaustive_no_field_t(x: Result<num::NonZero<u8>, NoField>); + fn result_1zst_exhaustive_single_field_t(x: Result<num::NonZero<u8>, Field>); + //~^ ERROR `extern` block uses type + fn result_cascading_t(x: Result<Result<(), num::NonZero<u8>>, ()>); + //~^ ERROR `extern` block uses type + + fn result_ref_e(x: Result<(), &'static u8>); + fn result_fn_e(x: Result<(), extern "C" fn()>); + fn result_nonnull_e(x: Result<(), std::ptr::NonNull<u8>>); + fn result_unique_e(x: Result<(), std::ptr::Unique<u8>>); + fn result_nonzero_u8_e(x: Result<(), num::NonZero<u8>>); + fn result_nonzero_u16_e(x: Result<(), num::NonZero<u16>>); + fn result_nonzero_u32_e(x: Result<(), num::NonZero<u32>>); + fn result_nonzero_u64_e(x: Result<(), num::NonZero<u64>>); + fn result_nonzero_u128_e(x: Result<(), num::NonZero<u128>>); + //~^ ERROR `extern` block uses type `u128` + fn result_nonzero_usize_e(x: Result<(), num::NonZero<usize>>); + fn result_nonzero_i8_e(x: Result<(), num::NonZero<i8>>); + fn result_nonzero_i16_e(x: Result<(), num::NonZero<i16>>); + fn result_nonzero_i32_e(x: Result<(), num::NonZero<i32>>); + fn result_nonzero_i64_e(x: Result<(), num::NonZero<i64>>); + fn result_nonzero_i128_e(x: Result<(), num::NonZero<i128>>); + //~^ ERROR `extern` block uses type `i128` + fn result_nonzero_isize_e(x: Result<(), num::NonZero<isize>>); + fn result_transparent_struct_e(x: Result<(), TransparentStruct<num::NonZero<u8>>>); + fn result_transparent_enum_e(x: Result<(), TransparentEnum<num::NonZero<u8>>>); + fn result_transparent_union_e(x: Result<(), TransparentUnion<num::NonZero<u8>>>); + //~^ ERROR `extern` block uses type + fn result_repr_rust_e(x: Result<(), Rust<num::NonZero<u8>>>); + //~^ ERROR `extern` block uses type + fn result_phantom_e(x: Result<num::NonZero<u8>, std::marker::PhantomData<()>>); + fn result_1zst_exhaustive_no_variant_e(x: Result<Z, num::NonZero<u8>>); + fn result_1zst_exhaustive_single_variant_e(x: Result<U, num::NonZero<u8>>); + fn result_1zst_exhaustive_multiple_variant_e(x: Result<B, num::NonZero<u8>>); + //~^ ERROR `extern` block uses type + fn result_1zst_non_exhaustive_no_variant_e(x: Result<NonExhaustive, num::NonZero<u8>>); + //~^ ERROR `extern` block uses type + fn result_1zst_exhaustive_no_field_e(x: Result<NoField, num::NonZero<u8>>); + fn result_1zst_exhaustive_single_field_e(x: Result<Field, num::NonZero<u8>>); + //~^ ERROR `extern` block uses type + fn result_cascading_e(x: Result<(), Result<(), num::NonZero<u8>>>); + //~^ ERROR `extern` block uses type + } pub fn main() {} diff --git a/tests/ui/lint/lint-ctypes-enum.stderr b/tests/ui/lint/lint-ctypes-enum.stderr index 103fda8d402..c982f040fb6 100644 --- a/tests/ui/lint/lint-ctypes-enum.stderr +++ b/tests/ui/lint/lint-ctypes-enum.stderr @@ -1,8 +1,8 @@ error: `extern` block uses type `U`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:60:13 + --> $DIR/lint-ctypes-enum.rs:68:14 | -LL | fn uf(x: U); - | ^ not FFI-safe +LL | fn uf(x: U); + | ^ not FFI-safe | = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum = note: enum has no representation hint @@ -18,10 +18,10 @@ LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ error: `extern` block uses type `B`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:61:13 + --> $DIR/lint-ctypes-enum.rs:69:14 | -LL | fn bf(x: B); - | ^ not FFI-safe +LL | fn bf(x: B); + | ^ not FFI-safe | = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum = note: enum has no representation hint @@ -32,10 +32,10 @@ LL | enum B { | ^^^^^^ error: `extern` block uses type `T`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:62:13 + --> $DIR/lint-ctypes-enum.rs:70:14 | -LL | fn tf(x: T); - | ^ not FFI-safe +LL | fn tf(x: T); + | ^ not FFI-safe | = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum = note: enum has no representation hint @@ -46,47 +46,178 @@ LL | enum T { | ^^^^^^ error: `extern` block uses type `u128`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:74:23 + --> $DIR/lint-ctypes-enum.rs:82:31 | -LL | fn nonzero_u128(x: Option<num::NonZero<u128>>); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe +LL | fn option_nonzero_u128(x: Option<num::NonZero<u128>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe | = note: 128-bit integers don't currently have a known stable ABI error: `extern` block uses type `i128`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:81:23 + --> $DIR/lint-ctypes-enum.rs:89:31 | -LL | fn nonzero_i128(x: Option<num::NonZero<i128>>); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe +LL | fn option_nonzero_i128(x: Option<num::NonZero<i128>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe | = note: 128-bit integers don't currently have a known stable ABI error: `extern` block uses type `Option<TransparentUnion<NonZero<u8>>>`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:86:28 + --> $DIR/lint-ctypes-enum.rs:94:36 | -LL | fn transparent_union(x: Option<TransparentUnion<num::NonZero<u8>>>); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe +LL | fn option_transparent_union(x: Option<TransparentUnion<num::NonZero<u8>>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe | = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum = note: enum has no representation hint error: `extern` block uses type `Option<Rust<NonZero<u8>>>`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:88:20 + --> $DIR/lint-ctypes-enum.rs:96:28 | -LL | fn repr_rust(x: Option<Rust<num::NonZero<u8>>>); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe +LL | fn option_repr_rust(x: Option<Rust<num::NonZero<u8>>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe | = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum = note: enum has no representation hint -error: `extern` block uses type `Result<(), NonZero<i32>>`, which is not FFI-safe - --> $DIR/lint-ctypes-enum.rs:89:20 +error: `extern` block uses type `u128`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:106:33 + | +LL | fn result_nonzero_u128_t(x: Result<num::NonZero<u128>, ()>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: 128-bit integers don't currently have a known stable ABI + +error: `extern` block uses type `i128`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:113:33 + | +LL | fn result_nonzero_i128_t(x: Result<num::NonZero<i128>, ()>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: 128-bit integers don't currently have a known stable ABI + +error: `extern` block uses type `Result<TransparentUnion<NonZero<u8>>, ()>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:118:38 + | +LL | fn result_transparent_union_t(x: Result<TransparentUnion<num::NonZero<u8>>, ()>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<Rust<NonZero<u8>>, ()>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:120:30 + | +LL | fn result_repr_rust_t(x: Result<Rust<num::NonZero<u8>>, ()>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<NonZero<u8>, B>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:125:53 + | +LL | fn result_1zst_exhaustive_multiple_variant_t(x: Result<num::NonZero<u8>, B>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<NonZero<u8>, NonExhaustive>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:127:51 + | +LL | fn result_1zst_non_exhaustive_no_variant_t(x: Result<num::NonZero<u8>, NonExhaustive>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<NonZero<u8>, Field>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:130:49 + | +LL | fn result_1zst_exhaustive_single_field_t(x: Result<num::NonZero<u8>, Field>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<Result<(), NonZero<u8>>, ()>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:132:30 + | +LL | fn result_cascading_t(x: Result<Result<(), num::NonZero<u8>>, ()>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `u128`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:143:33 + | +LL | fn result_nonzero_u128_e(x: Result<(), num::NonZero<u128>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: 128-bit integers don't currently have a known stable ABI + +error: `extern` block uses type `i128`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:150:33 + | +LL | fn result_nonzero_i128_e(x: Result<(), num::NonZero<i128>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: 128-bit integers don't currently have a known stable ABI + +error: `extern` block uses type `Result<(), TransparentUnion<NonZero<u8>>>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:155:38 + | +LL | fn result_transparent_union_e(x: Result<(), TransparentUnion<num::NonZero<u8>>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<(), Rust<NonZero<u8>>>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:157:30 + | +LL | fn result_repr_rust_e(x: Result<(), Rust<num::NonZero<u8>>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<B, NonZero<u8>>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:162:53 + | +LL | fn result_1zst_exhaustive_multiple_variant_e(x: Result<B, num::NonZero<u8>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<NonExhaustive, NonZero<u8>>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:164:51 + | +LL | fn result_1zst_non_exhaustive_no_variant_e(x: Result<NonExhaustive, num::NonZero<u8>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<Field, NonZero<u8>>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:167:49 + | +LL | fn result_1zst_exhaustive_single_field_e(x: Result<Field, num::NonZero<u8>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Result<(), Result<(), NonZero<u8>>>`, which is not FFI-safe + --> $DIR/lint-ctypes-enum.rs:169:30 | -LL | fn no_result(x: Result<(), num::NonZero<i32>>); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe +LL | fn result_cascading_e(x: Result<(), Result<(), num::NonZero<u8>>>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe | = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum = note: enum has no representation hint -error: aborting due to 8 previous errors +error: aborting due to 23 previous errors |
