rust-lang / rust-lang/rust-bindgen
`#pragma pack(1)` struct containing another packed struct is not packed itself.
Open
Nobody has claimed this yet.
bug
- Dominant language
- Rust
- Stars
- 5.3k
- Forks
- 829
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 15
Description
Input C/C++ Header
#include <stdint.h>
#pragma pack(1)
typedef struct {
uint64_t value;
} first_t;
typedef struct {
first_t value;
} second_t;
#pragma pack()
Bindgen Invocation
$ bindgen input.h
Actual Results
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct first_t {
pub value: u64,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct second_t {
pub value: first_t,
}
Expected Results
The second_t struct should be #[repr(C, packed)], not just #[repr(C)].
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct first_t {
pub value: u64,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct second_t {
pub value: first_t,
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the issue with the input.h header and the bindgen input.h command, then trace the struct-layout or attribute-generation path that emits repr attributes. Done means the generated second_t includes #[repr(C, packed)] while preserving the existing output for first_t.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, rust
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100