[clang] [clang] Add clang::preferred_type attribute for bitfields (PR #69104)

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 19 10:09:53 PDT 2023


erichkeane wrote:

> > > There's some danger here. _BitInt is a C23 feature as are enumerations with a fixed underlying type. Enumerations with a fixed underlying type explicitly disallow using a bit-precise integer type as the underlying type. See C23 6.7.2.2p4, which says in part, "For all the integer constant expressions which make up the values of the enumeration constants, there shall be a type capable of representing all the values that is a standard or extended signed or unsigned integer type, or char.".
> > 
> > 
> > Thank you for pointing out to this! But it's not clear to me whether this was an explicit decision to not add bit-precise integers here, or just nobody cared enough to push for that. Because use case we have on our hands seems legit to me.
> 
> Explicit decision: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3030.htm#design-bit.precise.integers -- we should add that diagnostic at some point. :-D
> 
> The biggest concern I had is that bit-precise integer types do not undergo integer promotions, but enumerations do. So it's unclear what the expectations are in this case. Should `enum Foo : unsigned _BitInt(8);` promote to `int` like `unsigned char` would, or should it not promote like `unsigned _BitInt(8)` would?

Ooof, yeah, this needs to be ill-formed, I'd never thought of that when implementing it.

https://github.com/llvm/llvm-project/pull/69104


More information about the cfe-commits mailing list