1 /* { dg-options "-O2 -w" } */
2 
3 /* N1150 5.1 Conversions from decimal float to integer.  */
4 
5 /* Test decimal float to integer conversions for values at the limit of
6    what will fit into the destination type.  This assumes 32-bit int and
7    64-bit long long (there's a check for that below).  This version tests
8    conversions during compilation.  */
9 
10 #include "dfp-dbg.h"
11 
12 extern void link_error (void);
13 
14 void
doit()15 doit ()
16 {
17   _Decimal32 d32;
18   _Decimal64 d64;
19   _Decimal128 d128;
20   int si;
21   unsigned int ui;
22   long long sll;
23   unsigned long long ull;
24 
25   /* _Decimal32 to int.  */
26 
27   d32 = 2147483.E3DF;
28   si = d32;
29   if (si != 2147483000)
30     link_error ();
31 
32   d32 = -2147483.E3DF;
33   si = d32;
34   if (si != -2147483000)
35     link_error ();
36 
37   /* _Decimal32 to unsigned int.  */
38 
39   d32 = 4.294967E9DF;
40   ui = d32;
41   if (ui != 4294967000U)
42     link_error ();
43 
44   /* _Decimal32 to long long.  */
45 
46   d32 = 922.3372E16DF;
47   sll = d32;
48   if (sll != 9223372000000000000LL)
49     link_error ();
50 
51   d32 = -92233.72E14DF;
52   sll = d32;
53   if (sll != -9223372000000000000LL)
54     link_error ();
55 
56   /* _Decimal32 to unsigned long long.  */
57 
58   d32 = 0.1844674E20DF;
59   ull = d32;
60   if (ull != 18446740000000000000ULL)
61     link_error ();
62 
63   /* _Decimal64 to int.  */
64 
65   d64 = 2.147483647E9DD;
66   si = d64;
67   if (si != 2147483647)
68     link_error ();
69 
70   d64 = -2147483648.DD;
71   si = d64;
72   if (si != -2147483648)
73     link_error ();
74 
75   /* _Decimal64 to unsigned int.  */
76 
77   d64 = 42949.67295E5DD;
78   ui = d64;
79   if (ui != 4294967295)
80     link_error ();
81 
82   /* _Decimal64 to long long.  */
83 
84   d64 = 9.223372036854775E18DD;
85   sll = d64;
86   if (sll != 9223372036854775000LL)
87     link_error ();
88 
89   d64 = -92233720.36854775E11DD;
90   sll = d64;
91   if (sll != -9223372036854775000LL)
92     link_error ();
93 
94   /* _Decimal64 to unsigned long long.  */
95   d64 = 1844674407370955.E4DD;
96   ull = d64;
97   if (ull != 18446744073709550000ULL)
98     link_error ();
99 
100   /* _Decimal128 to int.  */
101 
102   d128 = 2.147483647E9DL;
103   si = d128;
104   if (si != 2147483647)
105     link_error ();
106 
107   d128 = -2147483648.DL;
108   si = d128;
109   if (si != -2147483648)
110     link_error ();
111 
112   /* _Decimal128 to unsigned int.  */
113 
114   d128 = 4294.967295E6DL;
115   ui = d128;
116   if (ui != 4294967295)
117     link_error ();
118 
119   /* _Decimal128 to long long.  */
120 
121   d128 = 9223372036854775807.DL;
122   sll = d128;
123   if (sll != 9223372036854775807LL)
124     link_error ();
125 
126   d128 = -9.223372036854775808E19DL;
127   sll = d128;
128   if (sll != -9223372036854775807LL - 1LL)
129     link_error ();
130 
131   /* _Decimal128 to unsigned long long.  */
132   d128 = 18446744073709551615.DL;
133   ull = d128;
134   if (ull != 18446744073709551615ULL)
135     link_error ();
136 }
137 
138 int
main()139 main ()
140 {
141   /* This test assumes 32-bit int and 64-bit long long.  */
142 
143   if (sizeof (int) != 4 || sizeof (long long) != 8)
144     return 0;
145 
146   doit ();
147   return 0;
148 }
149