/* Tests for _FloatN / _FloatNx types: compile and execution tests for valid code with complex arithmetic. Before including this file, define WIDTH as the value N; define EXT to 1 for _FloatNx and 0 for _FloatN. */ #define CONCATX(X, Y) X ## Y #define CONCAT(X, Y) CONCATX (X, Y) #define CONCAT3(X, Y, Z) CONCAT (CONCAT (X, Y), Z) #define CONCAT4(W, X, Y, Z) CONCAT (CONCAT (CONCAT (W, X), Y), Z) #if EXT # define TYPE CONCAT3 (_Float, WIDTH, x) # define CST(C) CONCAT4 (C, f, WIDTH, x) # define CSTI(C) CONCAT4 (C, if, WIDTH, x) # define CSTI2(C) CONCAT4 (C, F, WIDTH, xi) #else # define TYPE CONCAT (_Float, WIDTH) # define CST(C) CONCAT3 (C, f, WIDTH) # define CSTI(C) CONCAT3 (C, if, WIDTH) # define CSTI2(C) CONCAT4 (C, F, WIDTH, i) #endif extern void exit (int); extern void abort (void); volatile TYPE a = CST (1.0); volatile _Complex TYPE b = CST (2.0) + CSTI (3.0); volatile _Complex TYPE c = CST (2.0) + CSTI2 (3.0); volatile _Complex TYPE d = __builtin_complex (CST (2.0), CST (3.0)); _Complex TYPE fn (_Complex TYPE arg) { return arg / 4; } int main (void) { volatile _Complex TYPE r; if (b != c) abort (); if (b != d) abort (); r = a + b; if (__real__ r != CST (3.0) || __imag__ r != CST (3.0)) abort (); r += d; if (__real__ r != CST (5.0) || __imag__ r != CST (6.0)) abort (); r -= a; if (__real__ r != CST (4.0) || __imag__ r != CST (6.0)) abort (); r /= (a + a); if (__real__ r != CST (2.0) || __imag__ r != CST (3.0)) abort (); r *= (a + a); if (__real__ r != CST (4.0) || __imag__ r != CST (6.0)) abort (); r -= b; if (__real__ r != CST (2.0) || __imag__ r != CST (3.0)) abort (); r *= r; if (__real__ r != -CST (5.0) || __imag__ r != CST (12.0)) abort (); /* Division may not be exact, so round result before comparing. */ r /= b; r += __builtin_complex (CST (100.0), CST (100.0)); r -= __builtin_complex (CST (100.0), CST (100.0)); if (r != b) abort (); r = fn (r); if (__real__ r != CST (0.5) || __imag__ r != CST (0.75)) abort (); exit (0); }