| /* { dg-options "-O2 -w" } */ |
| |
| /* N1150 5.1 Conversions from decimal float to integer. */ |
| |
| /* Test decimal float to integer conversions for values at the limit of |
| what will fit into the destination type. This assumes 32-bit int and |
| 64-bit long long (there's a check for that below). This version tests |
| conversions during compilation. */ |
| |
| #include "dfp-dbg.h" |
| |
| extern void link_error (void); |
| |
| void |
| doit () |
| { |
| _Decimal32 d32; |
| _Decimal64 d64; |
| _Decimal128 d128; |
| int si; |
| unsigned int ui; |
| long long sll; |
| unsigned long long ull; |
| |
| /* _Decimal32 to int. */ |
| |
| d32 = 2147483.E3DF; |
| si = d32; |
| if (si != 2147483000) |
| link_error (); |
| |
| d32 = -2147483.E3DF; |
| si = d32; |
| if (si != -2147483000) |
| link_error (); |
| |
| /* _Decimal32 to unsigned int. */ |
| |
| d32 = 4.294967E9DF; |
| ui = d32; |
| if (ui != 4294967000U) |
| link_error (); |
| |
| /* _Decimal32 to long long. */ |
| |
| d32 = 922.3372E16DF; |
| sll = d32; |
| if (sll != 9223372000000000000LL) |
| link_error (); |
| |
| d32 = -92233.72E14DF; |
| sll = d32; |
| if (sll != -9223372000000000000LL) |
| link_error (); |
| |
| /* _Decimal32 to unsigned long long. */ |
| |
| d32 = 0.1844674E20DF; |
| ull = d32; |
| if (ull != 18446740000000000000ULL) |
| link_error (); |
| |
| /* _Decimal64 to int. */ |
| |
| d64 = 2.147483647E9DD; |
| si = d64; |
| if (si != 2147483647) |
| link_error (); |
| |
| d64 = -2147483648.DD; |
| si = d64; |
| if (si != -2147483648) |
| link_error (); |
| |
| /* _Decimal64 to unsigned int. */ |
| |
| d64 = 42949.67295E5DD; |
| ui = d64; |
| if (ui != 4294967295) |
| link_error (); |
| |
| /* _Decimal64 to long long. */ |
| |
| d64 = 9.223372036854775E18DD; |
| sll = d64; |
| if (sll != 9223372036854775000LL) |
| link_error (); |
| |
| d64 = -92233720.36854775E11DD; |
| sll = d64; |
| if (sll != -9223372036854775000LL) |
| link_error (); |
| |
| /* _Decimal64 to unsigned long long. */ |
| d64 = 1844674407370955.E4DD; |
| ull = d64; |
| if (ull != 18446744073709550000ULL) |
| link_error (); |
| |
| /* _Decimal128 to int. */ |
| |
| d128 = 2.147483647E9DL; |
| si = d128; |
| if (si != 2147483647) |
| link_error (); |
| |
| d128 = -2147483648.DL; |
| si = d128; |
| if (si != -2147483648) |
| link_error (); |
| |
| /* _Decimal128 to unsigned int. */ |
| |
| d128 = 4294.967295E6DL; |
| ui = d128; |
| if (ui != 4294967295) |
| link_error (); |
| |
| /* _Decimal128 to long long. */ |
| |
| d128 = 9223372036854775807.DL; |
| sll = d128; |
| if (sll != 9223372036854775807LL) |
| link_error (); |
| |
| d128 = -9.223372036854775808E19DL; |
| sll = d128; |
| if (sll != -9223372036854775807LL - 1LL) |
| link_error (); |
| |
| /* _Decimal128 to unsigned long long. */ |
| d128 = 18446744073709551615.DL; |
| ull = d128; |
| if (ull != 18446744073709551615ULL) |
| link_error (); |
| } |
| |
| int |
| main () |
| { |
| /* This test assumes 32-bit int and 64-bit long long. */ |
| |
| if (sizeof (int) != 4 || sizeof (long long) != 8) |
| return 0; |
| |
| doit (); |
| return 0; |
| } |