]> git.lizzy.rs Git - rust.git/blob - src/libcore/ffi.rs
Rollup merge of #54225 - pnkfelix:issue-53675-add-test-called-panic, r=petrochenkov
[rust.git] / src / libcore / ffi.rs
1 #![stable(feature = "", since = "1.30.0")]
2
3 #![allow(non_camel_case_types)]
4
5 //! Utilities related to FFI bindings.
6
7 use ::fmt;
8
9 /// Equivalent to C's `void` type when used as a [pointer].
10 ///
11 /// In essence, `*const c_void` is equivalent to C's `const void*`
12 /// and `*mut c_void` is equivalent to C's `void*`. That said, this is
13 /// *not* the same as C's `void` return type, which is Rust's `()` type.
14 ///
15 /// Ideally, this type would be equivalent to [`!`], but currently it may
16 /// be more ideal to use `c_void` for FFI purposes.
17 ///
18 /// [`!`]: ../../std/primitive.never.html
19 /// [pointer]: ../../std/primitive.pointer.html
20 // NB: For LLVM to recognize the void pointer type and by extension
21 //     functions like malloc(), we need to have it represented as i8* in
22 //     LLVM bitcode. The enum used here ensures this and prevents misuse
23 //     of the "raw" type by only having private variants.. We need two
24 //     variants, because the compiler complains about the repr attribute
25 //     otherwise.
26 #[repr(u8)]
27 #[stable(feature = "raw_os", since = "1.1.0")]
28 pub enum c_void {
29     #[unstable(feature = "c_void_variant", reason = "should not have to exist",
30                issue = "0")]
31     #[doc(hidden)] __variant1,
32     #[unstable(feature = "c_void_variant", reason = "should not have to exist",
33                issue = "0")]
34     #[doc(hidden)] __variant2,
35 }
36
37 #[stable(feature = "std_debug", since = "1.16.0")]
38 impl fmt::Debug for c_void {
39     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
40         f.pad("c_void")
41     }
42 }