[cfe-dev] SwitchStmt cond type and EnumConstantDecl type problems
Douglas Gregor
dgregor at apple.com
Mon Jan 11 16:26:14 PST 2010
On Jan 8, 2010, at 4:29 PM, Michal wrote:
> Hi,
> when clang parses such code :
>
> enum X {
> A,
> B,
> C };
>
> void foo(enum X)
> {
> switch(X) {
> case A:
> break;
> }
> }
>
> value of switch condition expr and CaseStmt->getLHS->evaluateAsInt()
> for each case stmt is ASPInt holding an unsigned value, but type of
> EnumConstantDecl->getInitVal() representing A,B,C is ASPInt holding a
> signed value.
>
> Is this intentional?
Yes. The enum constants have type 'int', which is signed, while the
case expressions will be converted to the type of the enum (whose
promoted type may not be 'int').
> I am trying to implement gcc's -Wswitch warning and this type mismatch
> forbids comparisons between case stmts and enum values. I don't know
> clang/llvm enough to know how to convert safely between ASPInts (how
> should I, if at all?).
You can construct an APSInt from an APInt + sign bit, then use
APSInt::extend to extend the APSInt to the appropriate bit width. Once
you've done so, you can compare them.
- Doug
More information about the cfe-dev
mailing list