[clang] [Clang][Sema] Fix type of enumerators in incomplete enumerations (PR #84068)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 8 04:47:37 PST 2024


https://github.com/AaronBallman approved this pull request.

Hmm, the rules are different between C and C++, but I think we may be okay. In C++:

https://eel.is/c++draft/enum#dcl.enum-5.sentence-6
Following the closing brace of an enum-specifier, each enumerator has the type of its enumeration.

In C23 6.7.3.3p12:
During the processing of each enumeration constant in the enumerator list, the type of the enumeration constant shall be: <long list of things>

p15:
The enumeration member type for an enumerated type without fixed underlying type upon completion is:
— int if all the values of the enumeration are representable as an int; or,
— the enumerated type.140)

Footnote 140) The integer type selected during processing of the enumerator list (before completion) of the enumeration may not be the same as the compatible implementation-defined integer type selected for the completed enumeration.

So I believe:
```
typedef enum EnumA {
  A
} EnumA;

enum EnumB {
  B,
  B1 = 1,
  B2 = A == B1
};
```
is not an enum compare warning in C++ because `B1` doesn't have an enumeration type due to the enumeration not being fully-defined, and is not an enum compare warning in C because `A` has type `int` (due to p15) and `B1` has type `int` (due to p12).

I think we play a bit fast-and-loose with the way we treat enum constants in C in Clang, but that's outside of the scope of this patch. So LGTM aside from some tiny nits!

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


More information about the cfe-commits mailing list