This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/33819] New: Miscompiled shift of C++ bitfield
- From: "ian at airs dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 19 Oct 2007 18:01:44 -0000
- Subject: [Bug c++/33819] New: Miscompiled shift of C++ bitfield
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
When this test is compiled and run using -O2 with gcc 4.2 and with mainline, it
fails (tested on i686-pc-linux-gnu). It succeeds with 4.1.
class s
{
public:
s(long long aa) : a(aa), i1(0) { }
long long id() const { return (this->a << 16) >> 16; }
bool operator< (s sv) { return this->a < sv.id(); }
private:
long long a : 48;
int i1 : 16;
};
s g(1);
int
main(int, char**)
{
if (g < (1LL << 38) - 1)
return 0;
else
return 1;
}
I haven't pinned down the exact problem. However, it appears to be due to the
fact that C++ creates the bitfield as a 48-bit signed integer type. The left
shift is done in that 48-bit type, not in the long long type which should be
used. The left shift and right shift in the 48 bit yield -1, which is
incorrect; it should yield ((1LL << 38) - 1).
--
Summary: Miscompiled shift of C++ bitfield
Product: gcc
Version: 4.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: ian at airs dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33819