blob: d3fc4bd57e19cef588ed481683d640d24c64da7a [file] [log] [blame]
/* { dg-do run }
* { dg-options "-std=gnu23 -O2" }
*/
/* We check that the incompatible enums as fields lead to
* incompatible types that can be assumed not to alias
* and that this is exploited during optimization. */
struct bar1 { int x; enum A1 { X1 = 1 } f; };
[[gnu::noinline,gnu::noipa]]
int test_bar1(struct bar1* a, void* b)
{
a->x = 1;
struct bar1 { int x; enum A1 { X1 = 2 } f; }* p = b;
p->x = 2;
return a->x;
}
struct bar2 { int x; enum A2 { X2 = 1 } f; };
[[gnu::noinline,gnu::noipa]]
int test_bar2(struct bar2* a, void* b)
{
a->x = 1;
struct bar2 { int x; enum B2 { X2 = 1 } f; }* p = b;
p->x = 2;
return a->x;
}
struct bar3 { int x; enum A3 { X3 = 1 } f; };
[[gnu::noinline,gnu::noipa]]
int test_bar3(struct bar3* a, void* b)
{
a->x = 1;
struct bar3 { int x; enum A3 { Y3 = 1 } f; }* p = b;
p->x = 2;
return a->x;
}
struct bar4 { int x; enum { Z4 = 1 } f; };
[[gnu::noinline,gnu::noipa]]
int test_bar4(struct bar4* a, void* b)
{
a->x = 1;
struct bar4 { int x; enum { Z4 = 1 } f; }* p = b;
p->x = 2;
return a->x;
}
int main()
{
struct bar1 z1;
if (1 != test_bar1(&z1, &z1))
__builtin_abort();
struct bar2 z2;
if (1 != test_bar2(&z2, &z2))
__builtin_abort();
struct bar3 z3;
if (1 != test_bar3(&z3, &z3))
__builtin_abort();
struct bar4 z4;
if (1 != test_bar4(&z4, &z4))
__builtin_abort();
return 0;
}