// Test for oversized bitfield alignment in structs on IA-32
|
// Test for oversized bitfield alignment in structs on IA-32
|
// { dg-do run { target i?86-*-* x86_64-*-* } }
|
// { dg-do run { target i?86-*-* x86_64-*-* } }
|
// { dg-options "-O2" }
|
// { dg-options "-O2" }
|
// Cygwin and mingw32 default to MASK_ALIGN_DOUBLE. Override to ensure
|
// Cygwin and mingw32 default to MASK_ALIGN_DOUBLE. Override to ensure
|
// 4-byte alignment.
|
// 4-byte alignment.
|
// { dg-options "-mno-align-double" { target i?86-*-cygwin* i?86-*-mingw* } }
|
// { dg-options "-mno-align-double" { target i?86-*-cygwin* i?86-*-mingw* } }
|
// { dg-require-effective-target ilp32 }
|
// { dg-require-effective-target ilp32 }
|
|
|
struct A
|
struct A
|
{
|
{
|
char a;
|
char a;
|
int b : 224; // { dg-warning "exceeds its type" "" }
|
int b : 224; // { dg-warning "exceeds its type" "" }
|
char c;
|
char c;
|
} a, a4[4];
|
} a, a4[4];
|
|
|
struct B
|
struct B
|
{
|
{
|
char d;
|
char d;
|
A e;
|
A e;
|
char f;
|
char f;
|
} b;
|
} b;
|
|
|
struct C
|
struct C
|
{
|
{
|
char g;
|
char g;
|
long long h : 64;
|
long long h : 64;
|
char i;
|
char i;
|
} c, c4[4];
|
} c, c4[4];
|
|
|
struct D
|
struct D
|
{
|
{
|
char j;
|
char j;
|
C k;
|
C k;
|
char l;
|
char l;
|
} d;
|
} d;
|
|
|
struct E
|
struct E
|
{
|
{
|
char m;
|
char m;
|
long long n : 160; // { dg-warning "exceeds its type" "" }
|
long long n : 160; // { dg-warning "exceeds its type" "" }
|
char o;
|
char o;
|
} e, e4[4];
|
} e, e4[4];
|
|
|
struct F
|
struct F
|
{
|
{
|
char p;
|
char p;
|
E q;
|
E q;
|
char r;
|
char r;
|
} f;
|
} f;
|
|
|
int main (void)
|
int main (void)
|
{
|
{
|
if (&a.c - &a.a != 32)
|
if (&a.c - &a.a != 32)
|
return 1;
|
return 1;
|
if (sizeof (a) != 36)
|
if (sizeof (a) != 36)
|
return 2;
|
return 2;
|
if (sizeof (a4) != 4 * 36)
|
if (sizeof (a4) != 4 * 36)
|
return 3;
|
return 3;
|
if (sizeof (b) != 2 * 4 + 36)
|
if (sizeof (b) != 2 * 4 + 36)
|
return 4;
|
return 4;
|
if (__alignof__ (b.e) != 4)
|
if (__alignof__ (b.e) != 4)
|
return 5;
|
return 5;
|
if (&c.i - &c.g != 12)
|
if (&c.i - &c.g != 12)
|
return 6;
|
return 6;
|
if (sizeof (c) != 16)
|
if (sizeof (c) != 16)
|
return 7;
|
return 7;
|
if (sizeof (c4) != 4 * 16)
|
if (sizeof (c4) != 4 * 16)
|
return 8;
|
return 8;
|
if (sizeof (d) != 2 * 4 + 16)
|
if (sizeof (d) != 2 * 4 + 16)
|
return 9;
|
return 9;
|
if (__alignof__ (d.k) != 4)
|
if (__alignof__ (d.k) != 4)
|
return 10;
|
return 10;
|
if (&e.o - &e.m != 24)
|
if (&e.o - &e.m != 24)
|
return 11;
|
return 11;
|
if (sizeof (e) != 28)
|
if (sizeof (e) != 28)
|
return 12;
|
return 12;
|
if (sizeof (e4) != 4 * 28)
|
if (sizeof (e4) != 4 * 28)
|
return 13;
|
return 13;
|
if (sizeof (f) != 2 * 4 + 28)
|
if (sizeof (f) != 2 * 4 + 28)
|
return 14;
|
return 14;
|
if (__alignof__ (f.q) != 4)
|
if (__alignof__ (f.q) != 4)
|
return 15;
|
return 15;
|
return 0;
|
return 0;
|
}
|
}
|
|
|