Skip to content

Conversation

@thedataking
Copy link
Contributor

@thedataking thedataking commented Aug 14, 2025

TODOs:

  • check enum width as suggested by @emilio in this comment
  • should there be a --rustified-non-exhaustive-repr-c-enum flag?
  • Update CHANGELOG.md

Closes #3263.

@thedataking thedataking force-pushed the rustified-enum-repr-c branch from 33d5339 to 1885dc0 Compare August 14, 2025 07:39
thedataking pushed a commit to immunant/rust-bindgen that referenced this pull request Aug 15, 2025
Copy link
Contributor

@emilio emilio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! One nit

Copy link
Contributor

@emilio emilio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, if we implement the suggested check for enum class Foo : uint8_t and so, we might not even need to add this switch? We could just repr(C) by default...

I think with this patch if you have something like:

enum class Foo : uint8_t {
};

Using this option will miscompile it.

At the very least we should add a big warning on this option since it'd cause wrong struct layout.

@thedataking
Copy link
Contributor Author

At the very least we should add a big warning on this option since it'd cause wrong struct layout.

I agree this would be good. However, it appears that LLVM does not expose the necessary APIs. Even if we exposed the necessary functionality, it would presumably only work for recent clang versions. Thoughts on how to proceed?

thedataking pushed a commit to immunant/rust-bindgen that referenced this pull request Aug 21, 2025
@thedataking thedataking force-pushed the rustified-enum-repr-c branch from ec7b724 to d020ef1 Compare August 21, 2025 10:49
@emilio
Copy link
Contributor

emilio commented Oct 18, 2025

What do you think of extending our layout tests to test the layout of enums? I think at least that would signal that there's something wrong with the generated code if you misuse this option.

Other than that it looks good.

@workingjubilee
Copy link
Member

Our repr(C) layout is actually very likely to be incorrect for many enums and we are considering how to deprecate it because it is very hard to address this.

@thedataking thedataking force-pushed the rustified-enum-repr-c branch from d020ef1 to 61f39db Compare January 8, 2026 22:19
thedataking pushed a commit to immunant/rust-bindgen that referenced this pull request Jan 8, 2026
@workingjubilee
Copy link
Member

@thedataking Your added test doesn't touch the case of most concern for repr(C): enums with values bigger than the platform's c_int.

Per Larsen added 5 commits January 14, 2026 15:24
It is not possible to control the repr via custom attributes so add a
new rustified enum variant which does not use repr(u*) or repr(i*).
Using repr(C) is sometimes necessary to bindgen enums used in functions
subject to cross-language CFI checks.

Closes 3263.

Link: https://rcvalle.com/docs/rust-cfi-design-doc/
Signed-off-by: Per Larsen <perlarsen@google.com>
@thedataking thedataking force-pushed the rustified-enum-repr-c branch from 623469e to 867ed28 Compare January 15, 2026 03:50
Add layout tests for --rustified-repr-c-enum, covering short-enum widths
and large enum values. Emit size/align asserts during codegen for enums.

Signed-off-by: Per Larsen <perlarsen@google.com>
@thedataking thedataking force-pushed the rustified-enum-repr-c branch from 867ed28 to a11cced Compare January 15, 2026 04:27
@thedataking
Copy link
Contributor Author

@thedataking Your added test doesn't touch the case of most concern for repr(C): enums with values bigger than the platform's c_int.

Good point, I added a test that requires the enum to have a 64-bit value. Any other cases of concern I should add?

@thedataking
Copy link
Contributor Author

What do you think of extending our layout tests to test the layout of enums? I think at least that would signal that there's something wrong with the generated code if you misuse this option.

@emilio I've added test cases for repr(C) specifically. I can also add testcases for rustified enums more broadly but that is a larger change... do you want it to be part of this PR or could we add it in a separate PR?

@thedataking thedataking requested a review from emilio January 15, 2026 04:34
@workingjubilee
Copy link
Member

Good point, I added a test that requires the enum to have a 64-bit value. Any other cases of concern I should add?

In addition to u32::MAX + 1, I believe the other "touchy" cases are

  • an enum with a value in i32::MAX + 1..=u32::MAX
  • the previous enum but also with a negative value (so cannot be represented as u32)
  • in general, enums with both positive and negative values vs. ones with just positive values
  • anything in the i128 or u128 range

And maybe a "control" test for more usual-size enums without short-enums.

See rust-lang/rust#147017 for more on the issue here and the FCW that wound up landing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support repr(C) for enums

3 participants