Auto merge of #124747 - MasterAwesome:master, r=davidtwco
Support Result<T, E> across FFI when niche optimization can be used (v2) This PR is identical to #122253, which was approved and merged but then removed from master by a force-push due to a [CI bug](https://rust-lang.zulipchat.com/#narrow/stream/242791-t-infra/topic/ci.20broken.3F). r? ghost Original PR description: --- Allow allow enums like `Result<T, E>` to be used across FFI if the T/E can be niche optimized and the non-niche-optimized type is FFI safe. Implementation of https://github.com/rust-lang/rfcs/pull/3391 Tracking issue: https://github.com/rust-lang/rust/issues/110503 Additional ABI and codegen tests were added in https://github.com/rust-lang/rust/pull/115372
This commit is contained in:
commit
80420a693f
@ -579,6 +579,9 @@ declare_features! (
|
||||
(incomplete, repr128, "1.16.0", Some(56071)),
|
||||
/// Allows `repr(simd)` and importing the various simd intrinsics.
|
||||
(unstable, repr_simd, "1.4.0", Some(27731)),
|
||||
/// Allows enums like Result<T, E> to be used across FFI, if T's niche value can
|
||||
/// be used to describe E or vise-versa.
|
||||
(unstable, result_ffi_guarantees, "CURRENT_RUSTC_VERSION", Some(110503)),
|
||||
/// Allows bounding the return type of AFIT/RPITIT.
|
||||
(incomplete, return_type_notation, "1.70.0", Some(109417)),
|
||||
/// Allows `extern "rust-cold"`.
|
||||
|
@ -1101,6 +1101,32 @@ fn get_nullable_type<'tcx>(
|
||||
})
|
||||
}
|
||||
|
||||
/// A type is niche-optimization candidate iff:
|
||||
/// - Is a zero-sized type with alignment 1 (a “1-ZST”).
|
||||
/// - Has no fields.
|
||||
/// - Does not have the `#[non_exhaustive]` attribute.
|
||||
fn is_niche_optimization_candidate<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> bool {
|
||||
if tcx.layout_of(param_env.and(ty)).is_ok_and(|layout| !layout.is_1zst()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
match ty.kind() {
|
||||
ty::Adt(ty_def, _) => {
|
||||
let non_exhaustive = ty_def.is_variant_list_non_exhaustive();
|
||||
let empty = (ty_def.is_struct() && ty_def.all_fields().next().is_none())
|
||||
|| (ty_def.is_enum() && ty_def.variants().is_empty());
|
||||
|
||||
!non_exhaustive && empty
|
||||
}
|
||||
ty::Tuple(tys) => tys.is_empty(),
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// Check if this enum can be safely exported based on the "nullable pointer optimization". If it
|
||||
/// can, return the type that `ty` can be safely converted to, otherwise return `None`.
|
||||
/// Currently restricted to function pointers, boxes, references, `core::num::NonZero`,
|
||||
@ -1117,6 +1143,22 @@ pub(crate) fn repr_nullable_ptr<'tcx>(
|
||||
let field_ty = match &ty_def.variants().raw[..] {
|
||||
[var_one, var_two] => match (&var_one.fields.raw[..], &var_two.fields.raw[..]) {
|
||||
([], [field]) | ([field], []) => field.ty(tcx, args),
|
||||
([field1], [field2]) => {
|
||||
if !tcx.features().result_ffi_guarantees {
|
||||
return None;
|
||||
}
|
||||
|
||||
let ty1 = field1.ty(tcx, args);
|
||||
let ty2 = field2.ty(tcx, args);
|
||||
|
||||
if is_niche_optimization_candidate(tcx, param_env, ty1) {
|
||||
ty2
|
||||
} else if is_niche_optimization_candidate(tcx, param_env, ty2) {
|
||||
ty1
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
_ => return None,
|
||||
},
|
||||
_ => return None,
|
||||
@ -1202,7 +1244,6 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||
args: GenericArgsRef<'tcx>,
|
||||
) -> FfiResult<'tcx> {
|
||||
use FfiResult::*;
|
||||
|
||||
let transparent_with_all_zst_fields = if def.repr().transparent() {
|
||||
if let Some(field) = transparent_newtype_field(self.cx.tcx, variant) {
|
||||
// Transparent newtypes have at most one non-ZST field which needs to be checked..
|
||||
@ -1329,22 +1370,6 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||
return FfiSafe;
|
||||
}
|
||||
|
||||
// Check for a repr() attribute to specify the size of the
|
||||
// discriminant.
|
||||
if !def.repr().c() && !def.repr().transparent() && def.repr().int.is_none()
|
||||
{
|
||||
// Special-case types like `Option<extern fn()>`.
|
||||
if repr_nullable_ptr(self.cx.tcx, self.cx.param_env, ty, self.mode)
|
||||
.is_none()
|
||||
{
|
||||
return FfiUnsafe {
|
||||
ty,
|
||||
reason: fluent::lint_improper_ctypes_enum_repr_reason,
|
||||
help: Some(fluent::lint_improper_ctypes_enum_repr_help),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if def.is_variant_list_non_exhaustive() && !def.did().is_local() {
|
||||
return FfiUnsafe {
|
||||
ty,
|
||||
@ -1353,6 +1378,24 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||
};
|
||||
}
|
||||
|
||||
// Check for a repr() attribute to specify the size of the
|
||||
// discriminant.
|
||||
if !def.repr().c() && !def.repr().transparent() && def.repr().int.is_none()
|
||||
{
|
||||
// Special-case types like `Option<extern fn()>` and `Result<extern fn(), ()>`
|
||||
if let Some(ty) =
|
||||
repr_nullable_ptr(self.cx.tcx, self.cx.param_env, ty, self.mode)
|
||||
{
|
||||
return self.check_type_for_ffi(cache, ty);
|
||||
}
|
||||
|
||||
return FfiUnsafe {
|
||||
ty,
|
||||
reason: fluent::lint_improper_ctypes_enum_repr_reason,
|
||||
help: Some(fluent::lint_improper_ctypes_enum_repr_help),
|
||||
};
|
||||
}
|
||||
|
||||
// Check the contained variants.
|
||||
for variant in def.variants() {
|
||||
let is_non_exhaustive = variant.is_field_list_non_exhaustive();
|
||||
|
@ -1511,6 +1511,7 @@ symbols! {
|
||||
require,
|
||||
residual,
|
||||
result,
|
||||
result_ffi_guarantees,
|
||||
resume,
|
||||
return_position_impl_trait_in_trait,
|
||||
return_type_notation,
|
||||
|
@ -0,0 +1,14 @@
|
||||
# `result_ffi_guarantees`
|
||||
|
||||
The tracking issue for this feature is: [#110503]
|
||||
|
||||
[#110503]: https://github.com/rust-lang/rust/issues/110503
|
||||
|
||||
------------------------
|
||||
|
||||
This feature adds the possibility of using `Result<T, E>` in FFI if T's niche
|
||||
value can be used to describe E or vise-versa.
|
||||
|
||||
See [RFC 3391] for more information.
|
||||
|
||||
[RFC 3391]: https://github.com/rust-lang/rfcs/blob/master/text/3391-result_ffi_guarantees.md
|
99
tests/ui/feature-gates/feature-gate-result_ffi_guarantees.rs
Normal file
99
tests/ui/feature-gates/feature-gate-result_ffi_guarantees.rs
Normal file
@ -0,0 +1,99 @@
|
||||
#![allow(dead_code)]
|
||||
#![deny(improper_ctypes)]
|
||||
#![feature(ptr_internals)]
|
||||
|
||||
use std::num;
|
||||
|
||||
enum Z {}
|
||||
|
||||
#[repr(transparent)]
|
||||
struct TransparentStruct<T>(T, std::marker::PhantomData<Z>);
|
||||
|
||||
#[repr(transparent)]
|
||||
enum TransparentEnum<T> {
|
||||
Variant(T, std::marker::PhantomData<Z>),
|
||||
}
|
||||
|
||||
struct NoField;
|
||||
|
||||
extern "C" {
|
||||
fn result_ref_t(x: Result<&'static u8, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_fn_t(x: Result<extern "C" fn(), ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonnull_t(x: Result<std::ptr::NonNull<u8>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_unique_t(x: Result<std::ptr::Unique<u8>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u8_t(x: Result<num::NonZero<u8>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u16_t(x: Result<num::NonZero<u16>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u32_t(x: Result<num::NonZero<u32>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u64_t(x: Result<num::NonZero<u64>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_usize_t(x: Result<num::NonZero<usize>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i8_t(x: Result<num::NonZero<i8>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i16_t(x: Result<num::NonZero<i16>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i32_t(x: Result<num::NonZero<i32>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i64_t(x: Result<num::NonZero<i64>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_isize_t(x: Result<num::NonZero<isize>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_transparent_struct_t(x: Result<TransparentStruct<num::NonZero<u8>>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_transparent_enum_t(x: Result<TransparentEnum<num::NonZero<u8>>, ()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_phantom_t(x: Result<num::NonZero<u8>, std::marker::PhantomData<()>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_1zst_exhaustive_no_variant_t(x: Result<num::NonZero<u8>, Z>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_1zst_exhaustive_no_field_t(x: Result<num::NonZero<u8>, NoField>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
|
||||
fn result_ref_e(x: Result<(), &'static u8>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_fn_e(x: Result<(), extern "C" fn()>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonnull_e(x: Result<(), std::ptr::NonNull<u8>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_unique_e(x: Result<(), std::ptr::Unique<u8>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u8_e(x: Result<(), num::NonZero<u8>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u16_e(x: Result<(), num::NonZero<u16>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u32_e(x: Result<(), num::NonZero<u32>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_u64_e(x: Result<(), num::NonZero<u64>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_usize_e(x: Result<(), num::NonZero<usize>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i8_e(x: Result<(), num::NonZero<i8>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i16_e(x: Result<(), num::NonZero<i16>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i32_e(x: Result<(), num::NonZero<i32>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_i64_e(x: Result<(), num::NonZero<i64>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_nonzero_isize_e(x: Result<(), num::NonZero<isize>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_transparent_struct_e(x: Result<(), TransparentStruct<num::NonZero<u8>>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_transparent_enum_e(x: Result<(), TransparentEnum<num::NonZero<u8>>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_phantom_e(x: Result<num::NonZero<u8>, std::marker::PhantomData<()>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_1zst_exhaustive_no_variant_e(x: Result<Z, num::NonZero<u8>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
fn result_1zst_exhaustive_no_field_e(x: Result<NoField, num::NonZero<u8>>);
|
||||
//~^ ERROR `extern` block uses type `Result
|
||||
}
|
||||
|
||||
pub fn main() {}
|
349
tests/ui/feature-gates/feature-gate-result_ffi_guarantees.stderr
Normal file
349
tests/ui/feature-gates/feature-gate-result_ffi_guarantees.stderr
Normal file
@ -0,0 +1,349 @@
|
||||
error: `extern` block uses type `Result<&u8, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:20:24
|
||||
|
|
||||
LL | fn result_ref_t(x: Result<&'static 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
|
||||
note: the lint level is defined here
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:2:9
|
||||
|
|
||||
LL | #![deny(improper_ctypes)]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: `extern` block uses type `Result<extern "C" fn(), ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:22:23
|
||||
|
|
||||
LL | fn result_fn_t(x: Result<extern "C" fn(), ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<NonNull<u8>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:24:28
|
||||
|
|
||||
LL | fn result_nonnull_t(x: Result<std::ptr::NonNull<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<Unique<u8>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:26:27
|
||||
|
|
||||
LL | fn result_unique_t(x: Result<std::ptr::Unique<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>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:28:31
|
||||
|
|
||||
LL | fn result_nonzero_u8_t(x: 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 `Result<NonZero<u16>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:30:32
|
||||
|
|
||||
LL | fn result_nonzero_u16_t(x: Result<num::NonZero<u16>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<u32>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:32:32
|
||||
|
|
||||
LL | fn result_nonzero_u32_t(x: Result<num::NonZero<u32>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<u64>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:34:32
|
||||
|
|
||||
LL | fn result_nonzero_u64_t(x: Result<num::NonZero<u64>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<usize>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:36:34
|
||||
|
|
||||
LL | fn result_nonzero_usize_t(x: Result<num::NonZero<usize>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<i8>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:38:31
|
||||
|
|
||||
LL | fn result_nonzero_i8_t(x: Result<num::NonZero<i8>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<i16>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:40:32
|
||||
|
|
||||
LL | fn result_nonzero_i16_t(x: Result<num::NonZero<i16>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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/feature-gate-result_ffi_guarantees.rs:42:32
|
||||
|
|
||||
LL | fn result_nonzero_i32_t(x: Result<num::NonZero<i32>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<i64>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:44:32
|
||||
|
|
||||
LL | fn result_nonzero_i64_t(x: Result<num::NonZero<i64>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<isize>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:46:34
|
||||
|
|
||||
LL | fn result_nonzero_isize_t(x: Result<num::NonZero<isize>, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<TransparentStruct<NonZero<u8>>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:48:39
|
||||
|
|
||||
LL | fn result_transparent_struct_t(x: Result<TransparentStruct<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<TransparentEnum<NonZero<u8>>, ()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:50:37
|
||||
|
|
||||
LL | fn result_transparent_enum_t(x: Result<TransparentEnum<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>, PhantomData<()>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:52:28
|
||||
|
|
||||
LL | fn result_phantom_t(x: Result<num::NonZero<u8>, std::marker::PhantomData<()>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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>, Z>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:54:47
|
||||
|
|
||||
LL | fn result_1zst_exhaustive_no_variant_t(x: Result<num::NonZero<u8>, Z>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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>, NoField>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:56:45
|
||||
|
|
||||
LL | fn result_1zst_exhaustive_no_field_t(x: Result<num::NonZero<u8>, NoField>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<(), &u8>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:59:24
|
||||
|
|
||||
LL | fn result_ref_e(x: Result<(), &'static 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<(), extern "C" fn()>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:61:23
|
||||
|
|
||||
LL | fn result_fn_e(x: Result<(), extern "C" fn()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<(), NonNull<u8>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:63:28
|
||||
|
|
||||
LL | fn result_nonnull_e(x: Result<(), std::ptr::NonNull<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<(), Unique<u8>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:65:27
|
||||
|
|
||||
LL | fn result_unique_e(x: Result<(), std::ptr::Unique<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>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:67:31
|
||||
|
|
||||
LL | fn result_nonzero_u8_e(x: 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 `Result<(), NonZero<u16>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:69:32
|
||||
|
|
||||
LL | fn result_nonzero_u16_e(x: Result<(), num::NonZero<u16>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<u32>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:71:32
|
||||
|
|
||||
LL | fn result_nonzero_u32_e(x: Result<(), num::NonZero<u32>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<u64>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:73:32
|
||||
|
|
||||
LL | fn result_nonzero_u64_e(x: Result<(), num::NonZero<u64>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<usize>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:75:34
|
||||
|
|
||||
LL | fn result_nonzero_usize_e(x: Result<(), num::NonZero<usize>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<i8>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:77:31
|
||||
|
|
||||
LL | fn result_nonzero_i8_e(x: Result<(), num::NonZero<i8>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<i16>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:79:32
|
||||
|
|
||||
LL | fn result_nonzero_i16_e(x: Result<(), num::NonZero<i16>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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/feature-gate-result_ffi_guarantees.rs:81:32
|
||||
|
|
||||
LL | fn result_nonzero_i32_e(x: Result<(), num::NonZero<i32>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<i64>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:83:32
|
||||
|
|
||||
LL | fn result_nonzero_i64_e(x: Result<(), num::NonZero<i64>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<isize>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:85:34
|
||||
|
|
||||
LL | fn result_nonzero_isize_e(x: Result<(), num::NonZero<isize>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<(), TransparentStruct<NonZero<u8>>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:87:39
|
||||
|
|
||||
LL | fn result_transparent_struct_e(x: Result<(), TransparentStruct<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<(), TransparentEnum<NonZero<u8>>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:89:37
|
||||
|
|
||||
LL | fn result_transparent_enum_e(x: Result<(), TransparentEnum<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>, PhantomData<()>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:91:28
|
||||
|
|
||||
LL | fn result_phantom_e(x: Result<num::NonZero<u8>, std::marker::PhantomData<()>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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<Z, NonZero<u8>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:93:47
|
||||
|
|
||||
LL | fn result_1zst_exhaustive_no_variant_e(x: Result<Z, 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<NoField, NonZero<u8>>`, which is not FFI-safe
|
||||
--> $DIR/feature-gate-result_ffi_guarantees.rs:95:45
|
||||
|
|
||||
LL | fn result_1zst_exhaustive_no_field_e(x: Result<NoField, 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 38 previous errors
|
||||
|
@ -2,6 +2,7 @@
|
||||
#![deny(improper_ctypes)]
|
||||
#![feature(ptr_internals)]
|
||||
#![feature(transparent_unions)]
|
||||
#![feature(result_ffi_guarantees)]
|
||||
|
||||
use std::num;
|
||||
|
||||
@ -55,38 +56,123 @@ 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>);
|
||||
//~^ ERROR `extern` block uses type
|
||||
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>>);
|
||||
//~^ ERROR `extern` block uses type
|
||||
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
|
||||
fn result_unit_t_e(x: Result<(), ()>);
|
||||
//~^ ERROR `extern` block uses type
|
||||
}
|
||||
|
||||
pub fn main() {}
|
||||
|
@ -1,13 +1,13 @@
|
||||
error: `extern` block uses type `U`, which is not FFI-safe
|
||||
--> $DIR/lint-ctypes-enum.rs:60:13
|
||||
--> $DIR/lint-ctypes-enum.rs:69: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
|
||||
note: the type is defined here
|
||||
--> $DIR/lint-ctypes-enum.rs:9:1
|
||||
--> $DIR/lint-ctypes-enum.rs:10:1
|
||||
|
|
||||
LL | enum U {
|
||||
| ^^^^^^
|
||||
@ -18,75 +18,233 @@ 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:70: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
|
||||
note: the type is defined here
|
||||
--> $DIR/lint-ctypes-enum.rs:12:1
|
||||
--> $DIR/lint-ctypes-enum.rs:13:1
|
||||
|
|
||||
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:71: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
|
||||
note: the type is defined here
|
||||
--> $DIR/lint-ctypes-enum.rs:16:1
|
||||
--> $DIR/lint-ctypes-enum.rs:17:1
|
||||
|
|
||||
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:83: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:90: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:95: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:97: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:107:33
|
||||
|
|
||||
LL | fn no_result(x: Result<(), num::NonZero<i32>>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe
|
||||
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:114: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:119: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: aborting due to 8 previous errors
|
||||
error: `extern` block uses type `Result<Rust<NonZero<u8>>, ()>`, which is not FFI-safe
|
||||
--> $DIR/lint-ctypes-enum.rs:121: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>, U>`, which is not FFI-safe
|
||||
--> $DIR/lint-ctypes-enum.rs:125:51
|
||||
|
|
||||
LL | fn result_1zst_exhaustive_single_variant_t(x: Result<num::NonZero<u8>, 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
|
||||
|
||||
error: `extern` block uses type `Result<NonZero<u8>, B>`, which is not FFI-safe
|
||||
--> $DIR/lint-ctypes-enum.rs:127: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:129: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:132: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:134: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:145: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:152: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:157: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:159: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<U, NonZero<u8>>`, which is not FFI-safe
|
||||
--> $DIR/lint-ctypes-enum.rs:163:51
|
||||
|
|
||||
LL | fn result_1zst_exhaustive_single_variant_e(x: Result<U, 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:165: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:167: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:170: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:172:30
|
||||
|
|
||||
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: `extern` block uses type `Result<(), ()>`, which is not FFI-safe
|
||||
--> $DIR/lint-ctypes-enum.rs:174:27
|
||||
|
|
||||
LL | fn result_unit_t_e(x: Result<(), ()>);
|
||||
| ^^^^^^^^^^^^^^ 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 26 previous errors
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user