1  /* PR libstdc++/88101 */
       2  
       3  union V { char a; signed char b; unsigned char c; };
       4  struct T { char a; int b; union V c; };
       5  union U { int a; long double b; struct T c; };
       6  struct S { char a; union U b; long long c; char d; } s1, s2;
       7  
       8  __attribute__((noipa)) void
       9  foo (struct S *s, int x)
      10  {
      11    s->a = -1; s->c = -1; s->d = -1;
      12    switch (x)
      13      {
      14      case 0:
      15        s->b.a = -1;
      16        break;
      17      case 1:
      18        s->b.b = -12345.25L;
      19        break;
      20      case 2:
      21        s->b.c.a = -1;
      22        s->b.c.b = -1;
      23        s->b.c.c.b = -1;
      24        break;
      25      }
      26  }
      27  
      28  int
      29  main ()
      30  {
      31    __builtin_memset (&s1, 0, sizeof (s1));
      32    __builtin_memset (&s2, -1, sizeof (s2));
      33    foo (&s1, 0);
      34    foo (&s2, 0);
      35    __builtin_clear_padding (&s2);
      36    if (s2.b.a != (char) -1)
      37      __builtin_abort ();
      38    __builtin_clear_padding (&s2.b.a);
      39    __builtin_memset (&s2.b.a + 1, 0, sizeof (union U) - sizeof (s2.b.a));
      40    if (__builtin_memcmp (&s1, &s2, sizeof (s1)))
      41      __builtin_abort ();
      42    __builtin_memset (&s1, 0, sizeof (s1));
      43    __builtin_memset (&s2, -1, sizeof (s2));
      44    foo (&s1, 1);
      45    foo (&s2, 1);
      46    __builtin_clear_padding (&s2);
      47    if (s2.b.b != -12345.25L)
      48      __builtin_abort ();
      49    __builtin_clear_padding (&s2.b.b);
      50    __builtin_memset (&s2.b.b + 1, 0, sizeof (union U) - sizeof (s2.b.b));
      51    if (__builtin_memcmp (&s1, &s2, sizeof (s1)))
      52      __builtin_abort ();
      53    __builtin_memset (&s1, 0, sizeof (s1));
      54    __builtin_memset (&s2, -1, sizeof (s2));
      55    foo (&s1, 2);
      56    foo (&s2, 2);
      57    __builtin_clear_padding (&s2);
      58    if (s2.b.c.a != (char) -1 || s2.b.c.b != -1 || s2.b.c.c.b != -1)
      59      __builtin_abort ();
      60    __builtin_clear_padding (&s2.b.c);
      61    __builtin_memset (&s2.b.c + 1, 0, sizeof (union U) - sizeof (s2.b.c));
      62    if (__builtin_memcmp (&s1, &s2, sizeof (s1)))
      63      __builtin_abort ();
      64    return 0;
      65  }