> Index: lib/Sema/SemaExpr.cpp
> ===================================================================
> --- lib/Sema/SemaExpr.cpp     (revision 168447)
> +++ lib/Sema/SemaExpr.cpp     (working copy)
> [...]
> +      // Microsoft literals simply *are* the specified type, regardless of
> +      // whether the value fits into it or not, or whether they are hex or
> +      // decimal or octal.
> +      if (Literal.isLongLong) {
> +        Width = Context.getTargetInfo().getLongLongWidth();
> +        Ty = Literal.isUnsigned ? Context.UnsignedLongLongTy :
> +          Context.LongLongTy;
> +      } else if (Literal.isLong) {
> +        Width = Context.getTargetInfo().getLongWidth();
> +        Ty = Literal.isUnsigned ? Context.UnsignedLongTy : Context.LongTy;
> +      } else {
> +        Width = Context.getTargetInfo().getIntWidth();
> +        Ty = Literal.isUnsigned ? Context.UnsignedIntTy : Context.IntTy;
>        }
> 
> Hmm, it looks incorrect to use isLong here instead of checking 
> microsoftWidth. In particular, if I use -fms-extensions on Linux, this 
> static_assert fails:
> 
> static_assert(sizeof(0i32) == 4, "");
> 
> ... because 'long' is a 64-bit type on my target. (We also incorrectly use 
> 'int' for i16 and i8.) We should presumably use the smallest integer type 
> which is at least N bits wide. I'm OK with this being dealt with in a 
> separate patch, since it's not a regression.

I'll take a look at these in another patch.

> +      if (ResultVal.getActiveBits() > (Literal.isUnsigned ?
> +                                       Literal.microsoftWidth :
> +                                       Literal.microsoftWidth - 1)) {
> +        Diag(Tok.getLocation(), diag::warn_integer_too_large);
> +        // APInt asserts on NOP-truncations, so we need to be a little bit
> +        // carefull; otherwise we would crash when the literal is signed and
> +        // microsoftWidth == Width.
> +        if (Literal.microsoftWidth < Width)
> +          ResultVal = ResultVal.trunc(Literal.microsoftWidth);
> 
> This can be simplified somewhat by passing Literal.microsoftWidth instead of 
> 64 when constructing ResultVal (you'd still need to check for the high bit 
> being set for a signed literal).

Sounds good.

>        }
> +      
> +      // Unlike in the non-MS-literal case, we may have already truncated the
> +      // APInt to be smaller than the final literal, so we may need to adjust
> +      // the size in either direciton here; use sextOrTrunc instead of trunc.
> +      if (ResultVal.getBitWidth() != Width)
> +        ResultVal = ResultVal.sextOrTrunc(Width);
> 
> You should zext if the literal is unsigned (maybe make ResultVal an APSInt, 
> and use extOrTrunc). For instance, 0x18000Ui16 will currently first be 
> truncated to 0x8000 (with a warning), then sign extended to 0x80000000, 
> rather than producing the desired value 0x00008000.

Yep, I'll fix this.

> +      // Checking for 64-bit pointers is perhaps not the correct way to 
> detect
> +      // i128 support, but it seems to be what is done elsewhere.
> +      if (PP.getTargetInfo().getPointerWidth(0) >= 64) {
> 
> TargetInfo now has a hasInt128Type().

Great, that's very helpful.

- Steve

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to