diff --git a/src/bindgen/ir/field.rs b/src/bindgen/ir/field.rs index beec5a0..a20b407 100644 --- a/src/bindgen/ir/field.rs +++ b/src/bindgen/ir/field.rs @@ -46,5 +46,8 @@ impl Source for Field { fn write(&self, config: &Config, out: &mut SourceWriter) { self.documentation.write(config, out); cdecl::write_field(out, &self.ty, &self.name, config); + if let Some(bitfield) = self.annotations.atom("bitfield") { + write!(out, ": {}", bitfield.unwrap_or_default()); + } } } diff --git a/tests/expectations/bitfield.both.c b/tests/expectations/bitfield.both.c new file mode 100644 index 0000000..bd3e3dc --- /dev/null +++ b/tests/expectations/bitfield.both.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +typedef struct HasBitfields { + uint64_t foo: 8; + uint64_t bar: 56; +} HasBitfields; + +void root(const HasBitfields*); diff --git a/tests/expectations/bitfield.both.compat.c b/tests/expectations/bitfield.both.compat.c new file mode 100644 index 0000000..49d87e1 --- /dev/null +++ b/tests/expectations/bitfield.both.compat.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +typedef struct HasBitfields { + uint64_t foo: 8; + uint64_t bar: 56; +} HasBitfields; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +void root(const HasBitfields*); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/tests/expectations/bitfield.c b/tests/expectations/bitfield.c new file mode 100644 index 0000000..d54fa5a --- /dev/null +++ b/tests/expectations/bitfield.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +typedef struct { + uint64_t foo: 8; + uint64_t bar: 56; +} HasBitfields; + +void root(const HasBitfields*); diff --git a/tests/expectations/bitfield.compat.c b/tests/expectations/bitfield.compat.c new file mode 100644 index 0000000..aa906fa --- /dev/null +++ b/tests/expectations/bitfield.compat.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +typedef struct { + uint64_t foo: 8; + uint64_t bar: 56; +} HasBitfields; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +void root(const HasBitfields*); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/tests/expectations/bitfield.cpp b/tests/expectations/bitfield.cpp new file mode 100644 index 0000000..3deb53f --- /dev/null +++ b/tests/expectations/bitfield.cpp @@ -0,0 +1,16 @@ +#include +#include +#include +#include +#include + +struct HasBitfields { + uint64_t foo: 8; + uint64_t bar: 56; +}; + +extern "C" { + +void root(const HasBitfields*); + +} // extern "C" diff --git a/tests/expectations/bitfield.tag.c b/tests/expectations/bitfield.tag.c new file mode 100644 index 0000000..db327af --- /dev/null +++ b/tests/expectations/bitfield.tag.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +struct HasBitfields { + uint64_t foo: 8; + uint64_t bar: 56; +}; + +void root(const struct HasBitfields*); diff --git a/tests/expectations/bitfield.tag.compat.c b/tests/expectations/bitfield.tag.compat.c new file mode 100644 index 0000000..6aa8aed --- /dev/null +++ b/tests/expectations/bitfield.tag.compat.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +struct HasBitfields { + uint64_t foo: 8; + uint64_t bar: 56; +}; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +void root(const struct HasBitfields*); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/tests/rust/bitfield/Cargo.lock b/tests/rust/bitfield/Cargo.lock new file mode 100644 index 0000000..6594121 --- /dev/null +++ b/tests/rust/bitfield/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "bitfield" +version = "0.1.0" diff --git a/tests/rust/bitfield/Cargo.toml b/tests/rust/bitfield/Cargo.toml new file mode 100644 index 0000000..18a11a1 --- /dev/null +++ b/tests/rust/bitfield/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "bitfield" +version = "0.1.0" +authors = ["cbindgen"] + +[features] +cbindgen = [] diff --git a/tests/rust/bitfield/cbindgen.toml b/tests/rust/bitfield/cbindgen.toml new file mode 100644 index 0000000..27c92c8 --- /dev/null +++ b/tests/rust/bitfield/cbindgen.toml @@ -0,0 +1,3 @@ +[parse.expand] +crates = ["bitfield"] +features = ["cbindgen"] diff --git a/tests/rust/bitfield/src/lib.rs b/tests/rust/bitfield/src/lib.rs new file mode 100644 index 0000000..2369213 --- /dev/null +++ b/tests/rust/bitfield/src/lib.rs @@ -0,0 +1,15 @@ +#[repr(C)] +pub struct HasBitfields { + #[cfg(not(feature = "cbindgen"))] + foo_and_bar: u64, + + #[cfg(feature = "cbindgen")] + /// cbindgen:bitfield=8 + foo: u64, + #[cfg(feature = "cbindgen")] + /// cbindgen:bitfield=56 + bar: u64, +} + +#[no_mangle] +pub extern "C" fn root(_: &HasBitfields) {}