patch - gcc-4.0 not c99 conforming when assigning scalar values to boolean bitfields
Fariborz Jahanian
fjahanian@apple.com
Thu Mar 31 22:08:00 GMT 2005
gcc-4.0 is not c99 conforming when assigning scalar values to boolean
bitfields.
gcc-3.3 and g++4.0 are.
From: ISO/IEC 9899:1999 (E)
6.3.1.2 Boolean type
1 When any scalar value is converted to _Bool, the result is 0 if the
value compares equal to 0;
otherwise, the result is 1.
So, following test fails with gcc-4.0.
struct bits {
_Bool f2:6;
} b;
int main() {
b.f2 = 17;
return (b.f2 == 1 ? 0 : 1 );
}
Problem starts in c-decl.c's finish_struct routine which changes type
of bitfields to a new type
which can represent width of the bitfield. Here the fact that we have a
boolean bit-field is lost.
I fixed this problem by not doing this change for _Bool bitfields if
size of _Bool is enough to contain
width of the bitfield. This seems logical to me as _Bool is a special
case in that its precision (1) is different
that its type size. I spent some time going through
various areas of c front-end, as well as writing tests cases
(attached), but do not see how this can
break the compiler. If it does, then alternative would be to save the
original type in the new type and
use it where is needed (at list in two places; initialization and
assignment). This is, of course a far more
intrusive change. There is of course a chance that structure lay out
changes with this patch. But this
is OK because it moves us toward gcc-3.3's layout (a released gcc) and
away from gcc-4.0 (an unreleased
gcc).
Is this OK if testing all went well. So far, all bitfield tests in
dejagnu passed.
- fariborz (fjahanian@apple.com)
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: fsf-patch-4055075.txt
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20050331/fa46dee7/attachment.txt>
-------------- next part --------------
More information about the Gcc-patches
mailing list