rust-lang / rust-lang/rust-bindgen
ObjC ARC `__weak` struct fields are passed by value (`Copy`) instead of the hidden-pointer ABI
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 5.3k
- Forks
- 829
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 15
Description
Input C/C++ Header
typedef struct objc_object *id;
typedef struct {
__weak id w;
int t;
} W;
int takeW(W s, int z);
int takeWp(id p, int t);
id box7(void);
Bindgen Invocation
$ bindgen input.h --no-rustfmt-bindings -- -x objective-c -fobjc-arc
Actual Results
bindgen emits a Copy by-value struct. Layout tests compile (size_of::<W>() == 16).
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct W {
pub w: id,
pub t: ::std::os::raw::c_int,
}
unsafe extern "C" {
pub fn takeW(s: W, z: ::std::os::raw::c_int) -> ::std::os::raw::c_int;
pub fn takeWp(p: id, t: ::std::os::raw::c_int) -> ::std::os::raw::c_int;
}
An __weak field makes the record nontrivial for calls under ARC. Clang passes takeW indirectly (objc_copyWeak / hidden pointer). rustc passes [2 x i64] in registers.
On Darwin aarch64, s.t = 10, z = 1:
C takeW(s, 1) = 11 takeWp(o, 10) = 11
Rust takeW(s, 1) = 10 takeWp(o, 10) = 11
The thin __weak id parameter matches. Only the by-value struct disagrees.
This is not #778 (C++ Itanium user-destructor “non-trivial for the purposes of calls”). It is a C struct with an ObjC ARC ownership qualifier. bindgen has no __weak / objc_ownership handling.
Expected Results
A record with an __weak field should not be passed as a Copy by-value argument. Clang’s calling convention for that type is a hidden pointer; the generated signature should match that (or bindgen should refuse to emit a by-value Copy binding).
Environment
bindgen current main: 77cbc72
bindgen: 0.73.1
clang: Apple clang 21.0.0
rustc: 1.97.1
target: aarch64-apple-darwin
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 with input.h and reproduce the bindgen invocation using Objective-C ARC on aarch64-apple-darwin. Compare the generated W definition and takeW declaration with Clang's calling convention for a struct containing __weak id. Done means bindgen no longer emits an incorrect Copy by-value signature, either matching the hidden-pointer ABI or refusing that binding.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, objective-c, rust
- Domain
- compilers, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 50/100