On Tue April 26 2005 11:10, Joseph S. Myers wrote: > On Tue, 26 Apr 2005, Bruce Lilly wrote: > > > Demonstration code: > > -------------------------- > > #define AAA 0x1U > > #define BBB 0x2U > > > > struct foo { > > unsigned int bar:8; > > }; > > > > struct foo foos[] = { > > { ~(AAA) }, > > { ~(BBB) }, > > { ~(AAA|BBB) }, > > { ~(AAA&BBB) } > > }; > > -------------------------- > > > > compiling with gcc 3.x produced no warnings, as expected (no problems as > > all values fit easily within the defined structure's bit field). > > I don't see why you think the warnings are spurious. ~(AAA), for example, > is 4294967294,
No, in this context it is 254 (an 8-bit unsigned field with the LSB clear). > which being greater than 255 certainly does not fit within > the type unsigned:8. But 254 is certainly < 255. The 'U' in the constant simply means unsigned; if it had been specified as "LU" you might have a point. But it wasn't. > Previous GCC versions had a long-known bug whereby > they did not diagnose this; that bug has been fixed in GCC 4. Looks more like several bugs were introduced; consider: #if 0 #define AAA 0x1U #define BBB 0x2U #else static const unsigned char AAA = 0x1U; static const unsigned char BBB = 0x2U; #endif struct foo { unsigned int bar:8; }; struct foo foos[] = { { ~(AAA) }, { ~(BBB) }, { ~(AAA|BBB) }, { ~(AAA&BBB) } }; gcc 4.0.0 reports: gcctest.c:14: error: initializer element is not constant gcctest.c:14: error: (near initialization for 'foos[0].bar') gcctest.c:15: error: initializer element is not constant gcctest.c:15: error: (near initialization for 'foos[1].bar') gcctest.c:16: error: initializer element is not constant gcctest.c:16: error: (near initialization for 'foos[2].bar') gcctest.c:17: error: initializer element is not constant gcctest.c:17: error: (near initialization for 'foos[3].bar') Now it's claiming that two *explicitly declared* const values aren't constant!