This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: long bit-fields with g++ 4.4.1



Cedric Roux wrote:
> 
> If that is what you refer to:
> 3 An  rvalue for an integral bit-field (_class.bit_) can be converted to
>  an rvalue of type int if int can represent all the values of the  bit-
>  field;  otherwise, it can be converted to unsigned int if unsigned int
>  can represent all the values of the bit-field.  If  the  bit-field  is
>  larger yet, no integral promotion applies to it.  If the bit-field has
>  an enumerated type, it is treated as any other value of that type  for
>  promotion purposes.
> (found on the internet, I don't have the standard)
> 
> we can understand that "t" may be promoted to "int" (which is 32b) because
> it occupies 16 bits. And the << arithmetic operator asks for the
> promotion.
> 
> Maybe that's why you have 0.
> Maybe that's the way it has to be and gcc 4.0.2 was wrong.

Your citation applies, but my interpretation differs:

In C++ a bit-field has the declared type; the number of bits is not part of its
type [1][2].  The C++ integer promotion rules apply [your citation above]; in
particular the clause: "If the bit-field is larger yet, no integral promotion
applies to it".  A bit-field expression of declared type long is unchanged by
integer promotions, since (the number of bits in the bit-field being irrelevant)
long is larger than int and unsigned int.  So the expected output is:

    100000000 200000000 100000000
    8000 100000000 8000

[1] ISO/IEC 14882-1998 [class.bit] The bit-field attribute is not part of the
type of the class member.

[2] C++ Standard Core Language Issue #303
(http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_closed.html#303)

> 
> Note that doing:
>   printf("%lx %lx %lx\n", (T)t.f, (T)((unsigned long)t.f << 17),
> (T)(((unsigned long)t.f << 17) >> 17));
> prints what you wait (not 0)
> (with a g++ 4.3.2, not even 4.4.1)

Yes, we can cast, but the question is what is the correct behavior in the absence of
a cast.  I don't want to find all the places in existing code where a cast might
be necessary, if 4.4.1 behavior is a bug.

-- Vineet


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]