Enum constants of different type in same enum

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Enum constants of different type in same enum

Tom Stellard via cfe-dev
Hello,

Consider an enum: enum SignedAndUnsignedImplicit { SUI_Signed = 2,
SUI_Unsigned = 4294967295 };

If this code is compiled as C, its first enum constant has type 'int'
but the second has type 'unsigned int'. Is this intentional?

|-EnumDecl 0x56500d8615c8 <line:92:1, line:93:60> line:92:6
SignedAndUnsignedImplicit
| |-EnumConstantDecl 0x56500d8616a0 <col:34, col:47> col:34 SUI_Signed 'int'
| | `-IntegerLiteral 0x56500d861680 <col:47> 'int' 2
| `-EnumConstantDecl 0x56500d861710 <line:93:34, col:49> col:34
SUI_Unsigned 'unsigned int'
|   `-ImplicitCastExpr 0x56500d861760 <col:49> 'unsigned int' <IntegralCast>
|     `-IntegerLiteral 0x56500d8616f0 <col:49> 'long' 4294967295

I know that the second constant is malformed in C because it cannot be
represented as 'int'. However, there are some more test cases:

// NOTE: Both enum elements are 'unsigned int' actually due to an
implicit cast.
enum SignedAndUnsignedExplicitBig { SUEB_Signed = 4294967295LL,
SUEB_Unsigned = 4294967295ULL };

// NOTE: Both enum elements are 'int' actually due to an implicit cast.
enum SignedAndUnsignedExplicitSmall { SUES_Signed = 2L, SUES_Unsigned =
2ULL };

// NOTE: Both enum elements are 'unsigned long' actually due to an
implicit cast.
enum SignedAndUnsignedExplicitLL { SUEL_Signed = 5294967295LL,
SUEL_Unsigned = 5294967295ULL };

And the issue is not seen in these cases: all enum values have same type.

Thank you in advance.


--
Best regards,
Aleksei Sidorin,
SRR, Samsung Electronics

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev