/* PR tree-optimization/108498 */ /* { dg-require-effective-target int32plus } */ struct U { char c[16]; }; struct V { char c[16]; }; struct S { unsigned int a : 3, b : 8, c : 21; struct U d; unsigned int e; struct V f; unsigned int g : 5, h : 27; }; struct T { unsigned int a : 16, b : 8, c : 8; struct U d; unsigned int e; struct V f; unsigned int g : 5, h : 27; }; __attribute__((noipa)) void foo (struct S *p) { p->b = 231; p->c = 42; p->d = (struct U) { "abcdefghijklmno" }; p->e = 0xdeadbeef; p->f = (struct V) { "ABCDEFGHIJKLMNO" }; } __attribute__((noipa)) void bar (struct S *p) { p->b = 231; p->c = 42; p->d = (struct U) { "abcdefghijklmno" }; p->e = 0xdeadbeef; p->f = (struct V) { "ABCDEFGHIJKLMNO" }; p->g = 12; } __attribute__((noipa)) void baz (struct T *p) { p->c = 42; p->d = (struct U) { "abcdefghijklmno" }; p->e = 0xdeadbeef; p->f = (struct V) { "ABCDEFGHIJKLMNO" }; p->g = 12; } int main () { if (__CHAR_BIT__ != 8 || __SIZEOF_INT__ != 4) return 0; struct S s = {}; struct T t = {}; foo (&s); if (s.a != 0 || s.b != 231 || s.c != 42 || __builtin_memcmp (&s.d.c, "abcdefghijklmno", 16) || s.e != 0xdeadbeef || __builtin_memcmp (&s.f.c, "ABCDEFGHIJKLMNO", 16) || s.g != 0 || s.h != 0) __builtin_abort (); __builtin_memset (&s, 0, sizeof (s)); s.a = 7; s.g = 31; s.h = (1U << 27) - 1; foo (&s); if (s.a != 7 || s.b != 231 || s.c != 42 || __builtin_memcmp (&s.d.c, "abcdefghijklmno", 16) || s.e != 0xdeadbeef || __builtin_memcmp (&s.f.c, "ABCDEFGHIJKLMNO", 16) || s.g != 31 || s.h != (1U << 27) - 1) __builtin_abort (); __builtin_memset (&s, 0, sizeof (s)); bar (&s); if (s.a != 0 || s.b != 231 || s.c != 42 || __builtin_memcmp (&s.d.c, "abcdefghijklmno", 16) || s.e != 0xdeadbeef || __builtin_memcmp (&s.f.c, "ABCDEFGHIJKLMNO", 16) || s.g != 12 || s.h != 0) __builtin_abort (); __builtin_memset (&s, 0, sizeof (s)); s.a = 7; s.g = 31; s.h = (1U << 27) - 1; bar (&s); if (s.a != 7 || s.b != 231 || s.c != 42 || __builtin_memcmp (&s.d.c, "abcdefghijklmno", 16) || s.e != 0xdeadbeef || __builtin_memcmp (&s.f.c, "ABCDEFGHIJKLMNO", 16) || s.g != 12 || s.h != (1U << 27) - 1) __builtin_abort (); baz (&t); if (t.a != 0 || t.b != 0 || t.c != 42 || __builtin_memcmp (&t.d.c, "abcdefghijklmno", 16) || t.e != 0xdeadbeef || __builtin_memcmp (&t.f.c, "ABCDEFGHIJKLMNO", 16) || t.g != 12 || t.h != 0) __builtin_abort (); __builtin_memset (&s, 0, sizeof (s)); t.a = 7; t.b = 255; t.g = 31; t.h = (1U << 27) - 1; baz (&t); if (t.a != 7 || t.b != 255 || t.c != 42 || __builtin_memcmp (&t.d.c, "abcdefghijklmno", 16) || t.e != 0xdeadbeef || __builtin_memcmp (&t.f.c, "ABCDEFGHIJKLMNO", 16) || t.g != 12 || t.h != (1U << 27) - 1) __builtin_abort (); return 0; }