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

     1  /* Test arithmetics on bitfields.  */
     2  /* { dg-require-effective-target int32plus } */
     3  
     4  extern void abort (void);
     5  extern void exit (int);
     6  
     7  unsigned int
     8  myrnd (void)
     9  {
    10    static unsigned int s = 1388815473;
    11    s *= 1103515245;
    12    s += 12345;
    13    return (s / 65536) % 2048;
    14  }
    15  
    16  #define T(S)					\
    17  struct S s##S;					\
    18  struct S retme##S (struct S x)			\
    19  {						\
    20    return x;					\
    21  }						\
    22  						\
    23  unsigned int fn1##S (unsigned int x)		\
    24  {						\
    25    struct S y = s##S;				\
    26    y.k += x;					\
    27    y = retme##S (y);				\
    28    return y.k;					\
    29  }						\
    30  						\
    31  unsigned int fn2##S (unsigned int x)		\
    32  {						\
    33    struct S y = s##S;				\
    34    y.k += x;					\
    35    y.k %= 15;					\
    36    return y.k;					\
    37  }						\
    38  						\
    39  unsigned int retit##S (void)			\
    40  {						\
    41    return s##S.k;				\
    42  }						\
    43  						\
    44  unsigned int fn3##S (unsigned int x)		\
    45  {						\
    46    s##S.k += x;					\
    47    return retit##S ();				\
    48  }						\
    49  						\
    50  void test##S (void)				\
    51  {						\
    52    int i;					\
    53    unsigned int mask, v, a, r;			\
    54    struct S x;					\
    55    char *p = (char *) &s##S;			\
    56    for (i = 0; i < sizeof (s##S); ++i)		\
    57      *p++ = myrnd ();				\
    58    if (__builtin_classify_type (s##S.l) == 8)	\
    59      s##S.l = 5.25;				\
    60    s##S.k = -1;					\
    61    mask = s##S.k;				\
    62    v = myrnd ();					\
    63    a = myrnd ();					\
    64    s##S.k = v;					\
    65    x = s##S;					\
    66    r = fn1##S (a);				\
    67    if (x.i != s##S.i || x.j != s##S.j		\
    68        || x.k != s##S.k || x.l != s##S.l		\
    69        || ((v + a) & mask) != r)			\
    70      abort ();					\
    71    v = myrnd ();					\
    72    a = myrnd ();					\
    73    s##S.k = v;					\
    74    x = s##S;					\
    75    r = fn2##S (a);				\
    76    if (x.i != s##S.i || x.j != s##S.j		\
    77        || x.k != s##S.k || x.l != s##S.l		\
    78        || ((((v + a) & mask) % 15) & mask) != r)	\
    79      abort ();					\
    80    v = myrnd ();					\
    81    a = myrnd ();					\
    82    s##S.k = v;					\
    83    x = s##S;					\
    84    r = fn3##S (a);				\
    85    if (x.i != s##S.i || x.j != s##S.j		\
    86        || s##S.k != r || x.l != s##S.l		\
    87        || ((v + a) & mask) != r)			\
    88      abort ();					\
    89  }
    90  
    91  #define pck __attribute__((packed))
    92  struct pck A { unsigned short i : 1, l : 1, j : 3, k : 11; }; T(A)
    93  struct pck B { unsigned short i : 4, j : 1, k : 11; unsigned int l; }; T(B)
    94  struct pck C { unsigned int l; unsigned short i : 4, j : 1, k : 11; }; T(C)
    95  struct pck D { unsigned long long l : 6, i : 6, j : 23, k : 29; }; T(D)
    96  struct pck E { unsigned long long l, i : 12, j : 23, k : 29; }; T(E)
    97  struct pck F { unsigned long long i : 12, j : 23, k : 29, l; }; T(F)
    98  struct pck G { unsigned short i : 1, j : 1, k : 6; unsigned long long l; }; T(G)
    99  struct pck H { unsigned short i : 6, j : 2, k : 8; unsigned long long l; }; T(H)
   100  struct pck I { unsigned short i : 1, j : 6, k : 1; unsigned long long l; }; T(I)
   101  struct pck J { unsigned short i : 1, j : 8, k : 7; unsigned short l; }; T(J)
   102  struct pck K { unsigned int k : 6, l : 1, j : 10, i : 15; }; T(K)
   103  struct pck L { unsigned int k : 6, j : 11, i : 15; unsigned int l; }; T(L)
   104  struct pck M { unsigned int l; unsigned short k : 6, j : 11, i : 15; }; T(M)
   105  struct pck N { unsigned long long l : 6, k : 6, j : 23, i : 29; }; T(N)
   106  struct pck O { unsigned long long l, k : 12, j : 23, i : 29; }; T(O)
   107  struct pck P { unsigned long long k : 12, j : 23, i : 29, l; }; T(P)
   108  struct pck Q { unsigned short k : 12, j : 1, i : 3; unsigned long long l; }; T(Q)
   109  struct pck R { unsigned short k : 2, j : 11, i : 3; unsigned long long l; }; T(R)
   110  struct pck S { unsigned short k : 1, j : 6, i : 9; unsigned long long l; }; T(S)
   111  struct pck T { unsigned short k : 1, j : 8, i : 7; unsigned short l; }; T(T)
   112  struct pck U { unsigned short j : 6, k : 1, i : 9; unsigned long long l; }; T(U)
   113  struct pck V { unsigned short j : 8, k : 1, i : 7; unsigned short l; }; T(V)
   114  struct pck W { long double l; unsigned int k : 12, j : 13, i : 7; }; T(W)
   115  struct pck X { unsigned int k : 12, j : 13, i : 7; long double l; }; T(X)
   116  struct pck Y { unsigned int k : 12, j : 11, i : 9; long double l; }; T(Y)
   117  struct pck Z { long double l; unsigned int j : 13, i : 7, k : 12; }; T(Z)
   118  
   119  int
   120  main (void)
   121  {
   122    testA ();
   123    testB ();
   124    testC ();
   125    testD ();
   126    testE ();
   127    testF ();
   128    testG ();
   129    testH ();
   130    testI ();
   131    testJ ();
   132    testK ();
   133    testL ();
   134    testM ();
   135    testN ();
   136    testO ();
   137    testP ();
   138    testQ ();
   139    testR ();
   140    testS ();
   141    testT ();
   142    testU ();
   143    testV ();
   144    testW ();
   145    testX ();
   146    testY ();
   147    testZ ();
   148    exit (0);
   149  }