Skip to content

[Feature Request] Keep the integer literal radices of C and C++ in generated Rust #3236

@miikkas

Description

@miikkas

It would be great if the Rust code generated by bindgen would keep the number bases of the integer literals in the input C and C++ code. After all, the writer of the C or C++ code probably had a good reason for using a specific radix.

C231, C++142, and Rust3 all support binary, octal, and hexadecimal base numbers, with C23 and C++14 sharing the same syntax. A one-to-one mapping with Rust seems to be possible.

For example, given the following code working in both C23 and C++14:

#define BIN_LIT 0b10
#define OCT_LIT 010
#define HEX_LIT 0x10

the generated Rust bindings would be:

pub const BIN_LIT: u32 = 0b10;
pub const OCT_LIT: u32 = 0o10;
pub const HEX_LIT: u32 = 0x10;

In addition to the #defined constants, the number bases of e.g. consts and enums would be kept as well.

A bit of not too serious motivation

Just for the reference, if someone finds this interesting. I ran the following command in a fresh git clone of the Linux kernel repository, finding lines in .h files only that have a #define with a hexadecimal literal later on that line:

rg "\#define.+\b0x" --type h | wc -l

Currently, that's 4 519 652 such lines.

@rustbot label enhancement

Footnotes

  1. ISO/IEC 9899:2024 (en), draft N3220, chapter 6.4.4.2 Integer constants

  2. ISO/IEC 14882:2014, draft N3797, chapter 2.14.2 Integer literals

  3. Rust Reference: 2.6 Tokens, Number literals, 8.2.1 Literal expressions, Integer literals expressions

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions