[cfe-commits] [Patch] PR11179 - Update StmtPrinter to not complain on some IntegerLiteral types

Abramo Bagnara abramo.bagnara at gmail.com
Thu Nov 3 02:43:04 PDT 2011


Il 03/11/2011 00:49, Richard Trieu ha scritto:
> On Wed, Nov 2, 2011 at 4:21 PM, Abramo Bagnara <abramo.bagnara at gmail.com
> <mailto:abramo.bagnara at gmail.com>> wrote:
> 
>     Il 03/11/2011 00:16, Richard Trieu ha scritto:
>     > On Wed, Nov 2, 2011 at 3:51 PM, Abramo Bagnara
>     <abramo.bagnara at gmail.com <mailto:abramo.bagnara at gmail.com>
>     > <mailto:abramo.bagnara at gmail.com
>     <mailto:abramo.bagnara at gmail.com>>> wrote:
>     >
>     >     Il 02/11/2011 03:21, Richard Trieu ha scritto:
>     >     > On Mon, Oct 24, 2011 at 7:30 AM, Douglas Gregor
>     <dgregor at apple.com <mailto:dgregor at apple.com>
>     >     <mailto:dgregor at apple.com <mailto:dgregor at apple.com>>
>     >     > <mailto:dgregor at apple.com <mailto:dgregor at apple.com>
>     <mailto:dgregor at apple.com <mailto:dgregor at apple.com>>>> wrote:
>     >     >
>     >     >
>     >     >     On Oct 20, 2011, at 5:36 PM, Chandler Carruth wrote:
>     >     >
>     >     >>     On Thu, Oct 20, 2011 at 5:12 PM, Richard Trieu
>     >     <rtrieu at google.com <mailto:rtrieu at google.com>
>     <mailto:rtrieu at google.com <mailto:rtrieu at google.com>>
>     >     >>     <mailto:rtrieu at google.com <mailto:rtrieu at google.com>
>     <mailto:rtrieu at google.com <mailto:rtrieu at google.com>>>> wrote:
>     >     >>
>     >     >>         Should Clang be printing suffixes that are accepted
>     only with
>     >     >>         certain flags?
>     >     >>
>     >     >>
>     >     >>     I think this is an interesting policy decision. I'd
>     love to hear
>     >     >>     Doug's thoughts on it.
>     >     >>
>     >     >>     It seems fine to me for Clang, when running with
>     -fms-extensions,
>     >     >>     to suggest fixes even if only valid for
>     -fms-extensions. Clearly
>     >     >>     if there is a generic suggestion that could be made, that
>     >     would be
>     >     >>     a preferred alternative. For example, '__asm__' should be
>     >     >>     suggested before 'asm'.
>     >     >
>     >     >     I think it's fine for Clang to print suffixes that are only
>     >     accepted
>     >     >     with certain flags. Presumably, you should never get an
>     >     >     IntegerLiteral of type __int128_t unless you're in a
>     dialect that
>     >     >     supports parsing it.
>     >     >
>     >     >     … except that we cheat when we're building template
>     arguments,
>     >     >     because it was convenient. That cheating could be
>     eliminated by
>     >     >     encoding integer literal values directly within
>     >     >     SubstNonTypeTemplateParmExpr.
>     >     >
>     >     >     - Doug
>     >     >
>     >     >
>     >     > New patch.  Changes as follows:
>     >     > Add int128 and uint128 suffixes (i128 and Ui128) to StmtPrinter.
>     >      short
>     >     > and unsigned short will get to llvm_unreachable
>     >     > Add assert to IntergerLiteral to prevent creation with type
>     short or
>     >     > unsigned short
>     >     > Fix comment in IntegerLiteral to say that int128 and uint128 are
>     >     > acceptable types
>     >     > Change BuildExpressFromIntegralTemplateArgument to give a
>     proper Expr.
>     >     >  For negative numbers, use UnaryOperator of IntegerLiteral.
>      For short
>     >     > and unsigned short, ImplicitCastExpr from int.
>     >
>     >     Following this path have you considered how to represent an int
>     >     parameter with value INT_MIN?
>     >
>     >     I think there is no way you can represent it in standard
>     conformant way
>     >     except to use -INT_MAX - 1 (i.e. -2147483647 <tel:2147483647>
>     <tel:2147483647 <tel:2147483647>> - 1 if
>     >     int has 32 bits).
>     >
>     >     You cannot use -214783648 because no integer literal of type
>     int with
>     >     value 214783648 can exists.
>     >
>     >
>     > Richard Smith brought up a similar point in the code review
>     comments.  I
>     > am putting in an integer type selector which will move up to larger
>     > types until a large enough type can be found.  For instance, for
>     > int_min, use the negation of a long with a cast back to int.
> 
>     What about when you don't have a larger type? (i.e. the minimum negative
>     number of larger signed integral type)
> 
> 
> I'm thinking of switching to the unsigned version of that signed type.
>  And if that is still not large enough, assert, because there's nothing
> left Clang can do.

This kind of limitation (and complexity) make me think whether is a
better idea the proposal from Douglas to avoid an ordinary expression
child for SubstNonTypeTemplateParmExpr and instead replace it with either

- an APInt encapsulated in SubstNonTypeTemplateParmExpr
- a special purpose Expr node for non syntactic integer literal
- a flag in IntegerLiteral to mark it as non-syntactic and to represent
its ability to have arbitrary integral type and signed values

What do you think about this alternative?




More information about the cfe-commits mailing list