https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87137
Bug ID: 87137
Summary: [8 Regression] Non-virtual member function increases
struct size
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: manisandro at gmail dot com
Target Milestone: ---
With gcc-8.0.0 onwards, specifically commit
ab87ee8f509c0b600102195704105d4d98ec59d9, the following test case fails to
compile using either i686-w64-mingw32-g++ or x86_64-w64-mingw32-g++ (but
compiles normally using the native x86_64-linux-g++):
--- test.cpp ---
template <typename ToCheck, unsigned ExpectedSize, unsigned RealSize =
sizeof(ToCheck)>
void check_size() {
static_assert(ExpectedSize == RealSize, "Size is off!");
}
struct Foo {
unsigned u1 : 5;
unsigned u2 : 5;
unsigned u3 : 3;
unsigned u4 : 3;
unsigned u5 : 4;
unsigned u6 : 2;
unsigned u7 : 3;
unsigned u8 : 2;
unsigned u9 : 1;
unsigned u10 : 3;
// 31 bits
unsigned u11 : 2;
unsigned u12 : 2;
unsigned u13 : 2;
unsigned u14 : 6;
unsigned u15 : 7;
unsigned u16 : 1;
unsigned u17 : 1;
unsigned u18 : 1;
unsigned u19 : 1;
unsigned u20 : 1;
bool bar() const { return false; }
private:
unsigned u21 : 1;
unsigned u22 : 1;
unsigned u23 : 1;
unsigned u24 : 1;
// 59 bits
};
int main(int argc, char* argv[]) {
check_size<Foo, 8>();
return 0;
}
-----
$ x86_64-w64-mingw32-g++ test.cpp -o test.exe
test.cpp: In instantiation of 'void check_size() [with ToCheck = Foo; unsigned
int ExpectedSize = 8; unsigned int RealSize = 12]':
test.cpp:41:24: required from here
test.cpp:3:30: error: static assertion failed: Size is off!
static_assert(ExpectedSize == RealSize, "Size is off!");
Notice the presence of the bar member function. Without the member function,
sizeof(Foo) = 8 as expected, but with the member function, sizeof(Foo) = 12.