Description
In #1671, there is a reasonable argument made that a principled mapping between size_t
and usize
is improper.
However, all platforms that i'm aware of do equate the two.
bindgen's defaults since 0.53 mean that any binding that exposes a size_t results in an incompatible API across platforms. That is, if some package foo
exposes a bindgen-derived mapping of a C function size_t bar()
, then bar
will have a different signature on x86 (where it returns a u32
) than on x86_64 (where it returns a u64
). All downstream code that relies on that function will find itself dealing with the same divergent API across platforms. That's pretty weird and ugly for a typesafe langauge like rust. The behavior before 0.53 meant that the exposed API was congruent across platforms.
I think bindgen's default should be what the pre-0.53 behavior was, even though it is not in principle "correct". If we do that (so that size_t_is_usize
defaults to true
), then if bindgen is handling any size_t
on a platform where usize
≠ size_t
it could fail and abort. A package that wants to can still set size_t_is_usize(false)
if they want to be able to build on such a platform (and impose the consequent API type churn on their downstream dependencies).