OSDN Git Service

PR testsuite/41288
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / c-c++-common / dfp / convert-int-max-fold.c
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
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
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 }