1  /* Test for _Atomic in C11.  Basic execution tests for atomic compound
       2     assignment.  */
       3  /* { dg-do run } */
       4  /* { dg-options "-std=c11 -pedantic-errors" } */
       5  /* { dg-prune-output "warning: using serial compilation" } */
       6  
       7  extern void abort (void);
       8  extern void exit (int);
       9  
      10  #define CMPLX(X, Y) __builtin_complex ((X), (Y))
      11  
      12  #define TEST_COMPOUND(TYPE, LHSVAL, RHSVAL, OP)				\
      13    do									\
      14      {									\
      15        static volatile _Atomic (TYPE) a = (TYPE) (LHSVAL);		\
      16        if ((a OP##= (RHSVAL)) != (TYPE) ((TYPE) (LHSVAL) OP (RHSVAL)))	\
      17  	abort ();							\
      18        if (a != (TYPE) ((TYPE) (LHSVAL) OP (RHSVAL)))			\
      19  	abort ();							\
      20      }									\
      21    while (0)
      22  
      23  #define TEST_COMPOUND_ARITH(LHSVAL, RHSVAL, OP)				\
      24    do									\
      25      {									\
      26        TEST_COMPOUND (_Bool, (LHSVAL), (RHSVAL), OP);			\
      27        TEST_COMPOUND (char, (LHSVAL), (RHSVAL), OP);			\
      28        TEST_COMPOUND (signed char, (LHSVAL), (RHSVAL), OP);		\
      29        TEST_COMPOUND (unsigned char, (LHSVAL), (RHSVAL), OP);		\
      30        TEST_COMPOUND (signed short, (LHSVAL), (RHSVAL), OP);		\
      31        TEST_COMPOUND (unsigned short, (LHSVAL), (RHSVAL), OP);		\
      32        TEST_COMPOUND (signed int, (LHSVAL), (RHSVAL), OP);		\
      33        TEST_COMPOUND (unsigned int, (LHSVAL), (RHSVAL), OP);		\
      34        TEST_COMPOUND (signed long, (LHSVAL), (RHSVAL), OP);		\
      35        TEST_COMPOUND (unsigned long, (LHSVAL), (RHSVAL), OP);		\
      36        TEST_COMPOUND (signed long long, (LHSVAL), (RHSVAL), OP);		\
      37        TEST_COMPOUND (unsigned long long, (LHSVAL), (RHSVAL), OP);	\
      38        TEST_COMPOUND (float, (LHSVAL), (RHSVAL), OP);			\
      39        TEST_COMPOUND (double, (LHSVAL), (RHSVAL), OP);			\
      40        TEST_COMPOUND (long double, (LHSVAL), (RHSVAL), OP);		\
      41        TEST_COMPOUND (_Complex float, (LHSVAL), (RHSVAL), OP);		\
      42        TEST_COMPOUND (_Complex double, (LHSVAL), (RHSVAL), OP);		\
      43        TEST_COMPOUND (_Complex long double, (LHSVAL), (RHSVAL), OP);	\
      44      }									\
      45    while (0)
      46  
      47  #define TEST_COMPOUND_INT(LHSVAL, RHSVAL, OP)				\
      48    do									\
      49      {									\
      50        TEST_COMPOUND (_Bool, (LHSVAL), (RHSVAL), OP);			\
      51        TEST_COMPOUND (char, (LHSVAL), (RHSVAL), OP);			\
      52        TEST_COMPOUND (signed char, (LHSVAL), (RHSVAL), OP);		\
      53        TEST_COMPOUND (unsigned char, (LHSVAL), (RHSVAL), OP);		\
      54        TEST_COMPOUND (signed short, (LHSVAL), (RHSVAL), OP);		\
      55        TEST_COMPOUND (unsigned short, (LHSVAL), (RHSVAL), OP);		\
      56        TEST_COMPOUND (signed int, (LHSVAL), (RHSVAL), OP);		\
      57        TEST_COMPOUND (unsigned int, (LHSVAL), (RHSVAL), OP);		\
      58        TEST_COMPOUND (signed long, (LHSVAL), (RHSVAL), OP);		\
      59        TEST_COMPOUND (unsigned long, (LHSVAL), (RHSVAL), OP);		\
      60        TEST_COMPOUND (signed long long, (LHSVAL), (RHSVAL), OP);		\
      61        TEST_COMPOUND (unsigned long long, (LHSVAL), (RHSVAL), OP);	\
      62      }									\
      63    while (0)
      64  
      65  static void
      66  test_mult (void)
      67  {
      68    TEST_COMPOUND_ARITH (1, 2, *);
      69    TEST_COMPOUND_ARITH (-3, 5, *);
      70    TEST_COMPOUND_ARITH (-7, -20, *);
      71    TEST_COMPOUND_ARITH (1.25, 3.5, *);
      72    TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), CMPLX (3.5, 4.5), *);
      73    TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), 2, *);
      74  }
      75  
      76  static void
      77  test_div (void)
      78  {
      79    TEST_COMPOUND_ARITH (1, 2, /);
      80    TEST_COMPOUND_ARITH (-6, 3, /);
      81    TEST_COMPOUND_ARITH (-70, -10, /);
      82    TEST_COMPOUND_ARITH (1.25, 2.5, /);
      83    TEST_COMPOUND_ARITH (CMPLX (1.0, 1.0), CMPLX (0.5, 0.5), /);
      84    TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), 2, /);
      85  }
      86  
      87  static void
      88  test_mod (void)
      89  {
      90    TEST_COMPOUND_INT (1, 2, %);
      91    TEST_COMPOUND_INT (-3, 5, %);
      92    TEST_COMPOUND_INT (-7, -2, %);
      93  }
      94  
      95  static void
      96  test_plus (void)
      97  {
      98    TEST_COMPOUND_ARITH (1, 2, +);
      99    TEST_COMPOUND_ARITH (-3, 5, +);
     100    TEST_COMPOUND_ARITH (-7, -20, +);
     101    TEST_COMPOUND_ARITH (1.25, 3.5, +);
     102    TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), CMPLX (3.5, 4.5), +);
     103    TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), 2, +);
     104    static int ia[2];
     105    TEST_COMPOUND (int *, &ia[1], 1, +);
     106    TEST_COMPOUND (int *, &ia[1], -1, +);
     107  }
     108  
     109  static void
     110  test_minus (void)
     111  {
     112    TEST_COMPOUND_ARITH (1, 2, -);
     113    TEST_COMPOUND_ARITH (-3, 5, -);
     114    TEST_COMPOUND_ARITH (-7, -20, -);
     115    TEST_COMPOUND_ARITH (3.5, 1.25, -);
     116    TEST_COMPOUND_ARITH (CMPLX (3.5, 4.5), CMPLX (1.5, 2.5), -);
     117    TEST_COMPOUND_ARITH (CMPLX (3.5, 2.5), 2, -);
     118    static int ia[2];
     119    TEST_COMPOUND (int *, &ia[1], 1, -);
     120    TEST_COMPOUND (int *, &ia[1], -1, -);
     121  }
     122  
     123  static void
     124  test_lshift (void)
     125  {
     126    TEST_COMPOUND_INT (1, 7, <<);
     127    TEST_COMPOUND_INT (15, 3, <<);
     128  }
     129  
     130  static void
     131  test_rshift (void)
     132  {
     133    TEST_COMPOUND_INT (1, 1, >>);
     134    TEST_COMPOUND_INT (127, 4, >>);
     135  }
     136  
     137  static void
     138  test_and (void)
     139  {
     140    TEST_COMPOUND_INT (0x1234, 0x7856, &);
     141    TEST_COMPOUND_INT (-1, 0x12345678, &);
     142  }
     143  
     144  static void
     145  test_xor (void)
     146  {
     147    TEST_COMPOUND_INT (0x1234, 0x7856, ^);
     148    TEST_COMPOUND_INT (-1, 0x12345678, ^);
     149  }
     150  
     151  static void
     152  test_or (void)
     153  {
     154    TEST_COMPOUND_INT (0x1234, 0x7856, |);
     155    TEST_COMPOUND_INT (-12345, 0x12345678, |);
     156  }
     157  
     158  int
     159  main (void)
     160  {
     161    test_mult ();
     162    test_div ();
     163    test_mod ();
     164    test_plus ();
     165    test_minus ();
     166    test_lshift ();
     167    test_rshift ();
     168    test_and ();
     169    test_xor ();
     170    test_or ();
     171    exit (0);
     172  }