From 23e345bc0c79c43753b224ab127f5c06d553e4c4 Mon Sep 17 00:00:00 2001 From: Isaac Woods Date: Sun, 2 Sep 2018 22:06:32 +0100 Subject: [PATCH] Move std::os::raw::c_void into libcore and re-export in libstd --- src/libcore/ffi.rs | 42 ++++++++++++++++++++++++++++++++++++++++ src/libcore/lib.rs | 1 + src/libstd/ffi/mod.rs | 3 +++ src/libstd/os/raw/mod.rs | 37 ++--------------------------------- 4 files changed, 48 insertions(+), 35 deletions(-) create mode 100644 src/libcore/ffi.rs diff --git a/src/libcore/ffi.rs b/src/libcore/ffi.rs new file mode 100644 index 0000000000000..a03756f9c229f --- /dev/null +++ b/src/libcore/ffi.rs @@ -0,0 +1,42 @@ +#![stable(feature = "", since = "1.30.0")] + +#![allow(non_camel_case_types)] + +//! Utilities related to FFI bindings. + +use ::fmt; + +/// Equivalent to C's `void` type when used as a [pointer]. +/// +/// In essence, `*const c_void` is equivalent to C's `const void*` +/// and `*mut c_void` is equivalent to C's `void*`. That said, this is +/// *not* the same as C's `void` return type, which is Rust's `()` type. +/// +/// Ideally, this type would be equivalent to [`!`], but currently it may +/// be more ideal to use `c_void` for FFI purposes. +/// +/// [`!`]: ../../std/primitive.never.html +/// [pointer]: ../../std/primitive.pointer.html +// NB: For LLVM to recognize the void pointer type and by extension +// functions like malloc(), we need to have it represented as i8* in +// LLVM bitcode. The enum used here ensures this and prevents misuse +// of the "raw" type by only having private variants.. We need two +// variants, because the compiler complains about the repr attribute +// otherwise. +#[repr(u8)] +#[stable(feature = "raw_os", since = "1.1.0")] +pub enum c_void { + #[unstable(feature = "c_void_variant", reason = "should not have to exist", + issue = "0")] + #[doc(hidden)] __variant1, + #[unstable(feature = "c_void_variant", reason = "should not have to exist", + issue = "0")] + #[doc(hidden)] __variant2, +} + +#[stable(feature = "std_debug", since = "1.16.0")] +impl fmt::Debug for c_void { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("c_void") + } +} diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 763409327de2b..675e73e952cc2 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -202,6 +202,7 @@ pub mod iter; pub mod option; pub mod raw; pub mod result; +pub mod ffi; pub mod slice; pub mod str; diff --git a/src/libstd/ffi/mod.rs b/src/libstd/ffi/mod.rs index a37a5e8ae820b..a3345df5e0d85 100644 --- a/src/libstd/ffi/mod.rs +++ b/src/libstd/ffi/mod.rs @@ -171,5 +171,8 @@ pub use self::c_str::{FromBytesWithNulError}; #[stable(feature = "rust1", since = "1.0.0")] pub use self::os_str::{OsString, OsStr}; +#[stable(feature = "raw_os", since = "1.1.0")] +pub use core::ffi::c_void; + mod c_str; mod os_str; diff --git a/src/libstd/os/raw/mod.rs b/src/libstd/os/raw/mod.rs index dc33747c05b06..95faf3a5dd63d 100644 --- a/src/libstd/os/raw/mod.rs +++ b/src/libstd/os/raw/mod.rs @@ -18,8 +18,6 @@ #![stable(feature = "raw_os", since = "1.1.0")] -use fmt; - #[doc(include = "os/raw/char.md")] #[cfg(any(all(target_os = "linux", any(target_arch = "aarch64", target_arch = "arm", @@ -83,40 +81,9 @@ use fmt; #[doc(include = "os/raw/double.md")] #[stable(feature = "raw_os", since = "1.1.0")] pub type c_double = f64; -/// Equivalent to C's `void` type when used as a [pointer]. -/// -/// In essence, `*const c_void` is equivalent to C's `const void*` -/// and `*mut c_void` is equivalent to C's `void*`. That said, this is -/// *not* the same as C's `void` return type, which is Rust's `()` type. -/// -/// Ideally, this type would be equivalent to [`!`], but currently it may -/// be more ideal to use `c_void` for FFI purposes. -/// -/// [`!`]: ../../primitive.never.html -/// [pointer]: ../../primitive.pointer.html -// NB: For LLVM to recognize the void pointer type and by extension -// functions like malloc(), we need to have it represented as i8* in -// LLVM bitcode. The enum used here ensures this and prevents misuse -// of the "raw" type by only having private variants.. We need two -// variants, because the compiler complains about the repr attribute -// otherwise. -#[repr(u8)] #[stable(feature = "raw_os", since = "1.1.0")] -pub enum c_void { - #[unstable(feature = "c_void_variant", reason = "should not have to exist", - issue = "0")] - #[doc(hidden)] __variant1, - #[unstable(feature = "c_void_variant", reason = "should not have to exist", - issue = "0")] - #[doc(hidden)] __variant2, -} - -#[stable(feature = "std_debug", since = "1.16.0")] -impl fmt::Debug for c_void { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.pad("c_void") - } -} +#[doc(no_inline)] +pub use core::ffi::c_void; #[cfg(test)] #[allow(unused_imports)]