rust-bindgen icon indicating copy to clipboard operation
rust-bindgen copied to clipboard

Fails to generate correct code when `UINT64_C` is used

Open Kriskras99 opened this issue 7 months ago • 5 comments

I understand that getting the correct integer type from #define is very difficult, however using UINT64_C should clarify to bindgen that it's a 64-bit integer. Currently the macro parser fails on UINT64_C and the Clang macro fallback is needed, but that still generates a 32-bit integer.

Header:

#include <stdint.h>
#define SOMETHING UINT64_C(1)

Without --clang-macro-fallback:

bindgen --allowlist-item SOMETHING header.h

Output:

/* automatically generated by rust-bindgen 0.71.1 */


With --clang-macro-fallback:

bindgen --clang-macro-fallback --allowlist-item SOMETHING header.h

Output:

/* automatically generated by rust-bindgen 0.71.1 */

pub const SOMETHING: u32 = 1;

Kriskras99 avatar Apr 28 '25 14:04 Kriskras99

If this is not possible to do, you can just close this issue. But it feels like something that bindgen could do.

Kriskras99 avatar Apr 28 '25 14:04 Kriskras99

Cc: @jbaublitz

ojeda avatar Apr 29 '25 09:04 ojeda

Hi @Kriskras99, this has to do with the type of integers reported by Clang when evaluating macro bodies. It does not report a size so it ends up defaulting to a 32-bit width integer. Now theoretically we could make all of these integers 64-bit, but until Clang reports the correct size in this context, we can't really take a more fine-grained approach. We rely on Clang to report that information elsewhere in bindgen.

jbaublitz avatar Apr 29 '25 13:04 jbaublitz

Thanks for the detailed explanation!

Kriskras99 avatar Apr 29 '25 15:04 Kriskras99