modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr44468.c (about)

     1  #include <stddef.h>
     2  
     3  struct S {
     4    int i;
     5    int j;
     6  };
     7  struct R {
     8    int k;
     9    struct S a;
    10  };
    11  struct Q {
    12    float k;
    13    struct S a;
    14  };
    15  struct Q s;
    16  int __attribute__((noinline,noclone))
    17  test1 (void *q)
    18  {
    19    struct S *b = (struct S *)((char *)q + sizeof (int));
    20    s.a.i = 0;
    21    b->i = 3;
    22    return s.a.i;
    23  }
    24  int __attribute__((noinline,noclone))
    25  test2 (void *q)
    26  {
    27    struct S *b = &((struct R *)q)->a;
    28    s.a.i = 0;
    29    b->i = 3;
    30    return s.a.i;
    31  }
    32  int __attribute__((noinline,noclone))
    33  test3 (void *q)
    34  {
    35    s.a.i = 0;
    36    ((struct S *)((char *)q + sizeof (int)))->i = 3;
    37    return s.a.i;
    38  }
    39  extern void abort (void);
    40  int
    41  main()
    42  {
    43    if (sizeof (float) != sizeof (int)
    44        || offsetof (struct R, a) != sizeof (int)
    45        || offsetof (struct Q, a) != sizeof (int))
    46      return 0;
    47    s.a.i = 1;
    48    s.a.j = 2;
    49    if (test1 ((void *)&s) != 3)
    50      abort ();
    51    s.a.i = 1;
    52    s.a.j = 2;
    53    if (test2 ((void *)&s) != 3)
    54      abort ();
    55    s.a.i = 1;
    56    s.a.j = 2;
    57    if (test3 ((void *)&s) != 3)
    58      abort ();
    59    return 0;
    60  }