(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
floatn-complex.h
       1  /* Tests for _FloatN / _FloatNx types: compile and execution tests for
       2     valid code with complex arithmetic.  Before including this file,
       3     define WIDTH as the value N; define EXT to 1 for _FloatNx and 0 for
       4     _FloatN.  */
       5  
       6  #define CONCATX(X, Y) X ## Y
       7  #define CONCAT(X, Y) CONCATX (X, Y)
       8  #define CONCAT3(X, Y, Z) CONCAT (CONCAT (X, Y), Z)
       9  #define CONCAT4(W, X, Y, Z) CONCAT (CONCAT (CONCAT (W, X), Y), Z)
      10  
      11  #if EXT
      12  # define TYPE CONCAT3 (_Float, WIDTH, x)
      13  # define CST(C) CONCAT4 (C, f, WIDTH, x)
      14  # define CSTI(C) CONCAT4 (C, if, WIDTH, x)
      15  # define CSTI2(C) CONCAT4 (C, F, WIDTH, xi)
      16  #else
      17  # define TYPE CONCAT (_Float, WIDTH)
      18  # define CST(C) CONCAT3 (C, f, WIDTH)
      19  # define CSTI(C) CONCAT3 (C, if, WIDTH)
      20  # define CSTI2(C) CONCAT4 (C, F, WIDTH, i)
      21  #endif
      22  
      23  extern void exit (int);
      24  extern void abort (void);
      25  
      26  volatile TYPE a = CST (1.0);
      27  volatile _Complex TYPE b = CST (2.0) + CSTI (3.0);
      28  volatile _Complex TYPE c = CST (2.0) + CSTI2 (3.0);
      29  volatile _Complex TYPE d = __builtin_complex (CST (2.0), CST (3.0));
      30  
      31  _Complex TYPE
      32  fn (_Complex TYPE arg)
      33  {
      34    return arg / 4;
      35  }
      36  
      37  int
      38  main (void)
      39  {
      40    volatile _Complex TYPE r;
      41    if (b != c)
      42      abort ();
      43    if (b != d)
      44      abort ();
      45    r = a + b;
      46    if (__real__ r != CST (3.0) || __imag__ r != CST (3.0))
      47      abort ();
      48    r += d;
      49    if (__real__ r != CST (5.0) || __imag__ r != CST (6.0))
      50      abort ();
      51    r -= a;
      52    if (__real__ r != CST (4.0) || __imag__ r != CST (6.0))
      53      abort ();
      54    r /= (a + a);
      55    if (__real__ r != CST (2.0) || __imag__ r != CST (3.0))
      56      abort ();
      57    r *= (a + a);
      58    if (__real__ r != CST (4.0) || __imag__ r != CST (6.0))
      59      abort ();
      60    r -= b;
      61    if (__real__ r != CST (2.0) || __imag__ r != CST (3.0))
      62      abort ();
      63    r *= r;
      64    if (__real__ r != -CST (5.0) || __imag__ r != CST (12.0))
      65      abort ();
      66    /* Division may not be exact, so round result before comparing.  */
      67    r /= b;
      68    r += __builtin_complex (CST (100.0), CST (100.0));
      69    r -= __builtin_complex (CST (100.0), CST (100.0));
      70    if (r != b)
      71      abort ();
      72    r = fn (r);
      73    if (__real__ r != CST (0.5) || __imag__ r != CST (0.75))
      74      abort ();
      75    exit (0);
      76  }