/* { dg-options "-std=gnu99 -O0" } */ /* N1150 5.1 Conversion between decimal floating types and integer. C99 6.3.1.4(1a) New. */ extern void abort (void); int failcnt; #ifdef DBG extern int printf (const char *, ...); #define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; } #else #define FAILURE abort (); #endif _Decimal32 d32; _Decimal64 d64; _Decimal128 d128; unsigned int ui; unsigned long ul; unsigned long long ull; int si; long sl; long long sll; _Bool b; void init_dfp_1 (void) { d32 = 456.789df; d64 = 23.456789dd; d128 = 1234.5678dl; } void init_dfp_2 (void) { d32 = 1.23df; d64 = -3.4dd; d128 = 0.00003dl; } void init_dfp_3 (void) { d32 = 0.0DF; d64 = 0.0DD; d128 = 0.0DL; } void init_unsigned_int (void) { ui = 987U; ul = 345678UL; ull = 1234567ULL; } void init_signed_int (void) { si = -987; sl = -345678; sll = -1234567; } int main () { /* C99 Section 6.7.2 Type specifiers. Type _Bool is mentioned in this section. Conversions between _Bool and DFP types. */ /* Decimal float to unsigned integer. */ init_dfp_1 (); ui = d32; if (ui != 456U) FAILURE ul = d32; if (ul != 456UL) FAILURE ull = d32; if (ull != 456ULL) FAILURE ui = d64; if (ui != 23U) FAILURE ul = d64; if (ul != 23UL) FAILURE ull = d64; if (ull != 23ULL) FAILURE ui = d128; if (ui != 1234U) FAILURE ul = d128; if (ul != 1234UL) FAILURE ull = d128; if (ull != 1234ULL) FAILURE /* Decimal float to signed integer. */ /* Decimal float to _Bool. */ init_dfp_2 (); b = d32; if (!b) FAILURE b = d64; if (!b) FAILURE b = d128; if (!b) FAILURE /* Unsigned integer to decimal float. */ init_unsigned_int (); d32 = ui; if (d32 != 987.0df) FAILURE d32 = ul; if (d32 != 345678.0df) FAILURE d32 = ull; if (d32 != 1234567.df) FAILURE d64 = ui; if (d64 != 987.0dd) FAILURE d64 = ul; if (d64 != 345678.0dd) FAILURE d64 = ull; if (d64 != 1234567.dd) FAILURE d128 = ui; if (d128 != 987.0dl) FAILURE d128 = ul; if (d128 != 345678.0dl) FAILURE d128 = ull; if (d128 != 1234567.dl) FAILURE /* Signed integer to decimal float. */ init_signed_int (); d32 = si; if (d32 != -987.0df) FAILURE d32 = sl; if (d32 != -345678.0df) FAILURE d32 = sll; if (d32 != -1234567.df) FAILURE d64 = si; if (d64 != -987.0dd) FAILURE d64 = sl; if (d64 != -345678.0dd) FAILURE d64 = sll; if (d64 != -1234567.dd) FAILURE d128 = si; if (d128 != -987.0dl) FAILURE d128 = sl; if (d128 != -345678.0dl) FAILURE d128 = sll; if (d128 != -1234567.dl) FAILURE /* _Bool to decimal float. */ init_dfp_3 (); b = d32; if (b) FAILURE b = d64; if (b) FAILURE b = d128; if (b) FAILURE if (failcnt != 0) abort (); return 0; }