1// Copyright (C) 2009 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3.  If not see
16// <http://www.gnu.org/licenses/>.
17
18// { dg-require-effective-target dfp }
19
20// ISO/IEC TR 24733  3.2.2.6  Compound assignment (decimal32).
21// ISO/IEC TR 24733  3.2.3.6  Compound assignment (decimal64).
22// ISO/IEC TR 24733  3.2.4.6  Compound assignment (decimal128).
23
24// Access member functions directly.
25
26#include <decimal/decimal>
27#include <testsuite_hooks.h>
28
29using namespace std::decimal;
30
31decimal32 d32 (5);
32decimal64 d64 (-10);
33decimal128 d128 (25);
34int si = -2;
35unsigned int ui = 5;
36long sl = -10;
37unsigned long ul = 20;
38long long sll = -25;
39unsigned long long ull = 50;
40
41void
42compound_assignment_add_32 (void)
43{
44  decimal32 a (1000), b;
45
46  b = a; b.operator+=(d32);  VERIFY (b == 1005);
47  b = a; b.operator+=(d64);  VERIFY (b == 990);
48  b = a; b.operator+=(d128); VERIFY (b == 1025);
49  b = a; b.operator+=(si);   VERIFY (b == 998);
50  b = a; b.operator+=(ui);   VERIFY (b == 1005);
51  b = a; b.operator+=(sl);   VERIFY (b == 990);
52  b = a; b.operator+=(ul);   VERIFY (b == 1020);
53  b = a; b.operator+=(sll);  VERIFY (b == 975);
54  b = a; b.operator+=(ull);  VERIFY (b == 1050);
55}
56
57void
58compound_assignment_subtract_32 (void)
59{
60  decimal32 a (1000), b;
61
62  b = a; b.operator-=(d32);  VERIFY (b == 995);
63  b = a; b.operator-=(d64);  VERIFY (b == 1010);
64  b = a; b.operator-=(d128); VERIFY (b == 975);
65  b = a; b.operator-=(si);   VERIFY (b == 1002);
66  b = a; b.operator-=(ui);   VERIFY (b == 995);
67  b = a; b.operator-=(sl);   VERIFY (b == 1010);
68  b = a; b.operator-=(ul);   VERIFY (b == 980);
69  b = a; b.operator-=(sll);  VERIFY (b == 1025);
70  b = a; b.operator-=(ull);  VERIFY (b == 950);
71}
72
73void
74compound_assignment_multiply_32 (void)
75{
76  decimal32 a (1000), b;
77
78  b = a; b.operator*=(d32);  VERIFY (b == 5000);
79  b = a; b.operator*=(d64);  VERIFY (b == -10000);
80  b = a; b.operator*=(d128); VERIFY (b == 25000);
81  b = a; b.operator*=(si);   VERIFY (b == -2000);
82  b = a; b.operator*=(ui);   VERIFY (b == 5000);
83  b = a; b.operator*=(sl);   VERIFY (b == -10000);
84  b = a; b.operator*=(ul);   VERIFY (b == 20000);
85  b = a; b.operator*=(sll);  VERIFY (b == -25000);
86  b = a; b.operator*=(ull);  VERIFY (b == 50000);
87}
88
89void
90compound_assignment_divide_32 (void)
91{
92  decimal32 a (1000), b;
93
94  b = a; b.operator/=(d32);  VERIFY (b == 200);
95  b = a; b.operator/=(d64);  VERIFY (b == -100);
96  b = a; b.operator/=(d128); VERIFY (b == 40);
97  b = a; b.operator/=(si);   VERIFY (b == -500);
98  b = a; b.operator/=(ui);   VERIFY (b == 200);
99  b = a; b.operator/=(sl);   VERIFY (b == -100);
100  b = a; b.operator/=(ul);   VERIFY (b == 50);
101  b = a; b.operator/=(sll);  VERIFY (b == -40);
102  b = a; b.operator/=(ull);  VERIFY (b == 20);
103}
104
105void
106compound_assignment_add_64 (void)
107{
108  decimal64 a (1000), b;
109
110  b = a; b.operator+=(d32);  VERIFY (b == 1005);
111  b = a; b.operator+=(d64);  VERIFY (b == 990);
112  b = a; b.operator+=(d128); VERIFY (b == 1025);
113  b = a; b.operator+=(si);   VERIFY (b == 998);
114  b = a; b.operator+=(ui);   VERIFY (b == 1005);
115  b = a; b.operator+=(sl);   VERIFY (b == 990);
116  b = a; b.operator+=(ul);   VERIFY (b == 1020);
117  b = a; b.operator+=(sll);  VERIFY (b == 975);
118  b = a; b.operator+=(ull);  VERIFY (b == 1050);
119}
120
121void
122compound_assignment_subtract_64 (void)
123{
124  decimal64 a (1000), b;
125
126  b = a; b.operator-=(d32);  VERIFY (b == 995);
127  b = a; b.operator-=(d64);  VERIFY (b == 1010);
128  b = a; b.operator-=(d128); VERIFY (b == 975);
129  b = a; b.operator-=(si);   VERIFY (b == 1002);
130  b = a; b.operator-=(ui);   VERIFY (b == 995);
131  b = a; b.operator-=(sl);   VERIFY (b == 1010);
132  b = a; b.operator-=(ul);   VERIFY (b == 980);
133  b = a; b.operator-=(sll);  VERIFY (b == 1025);
134  b = a; b.operator-=(ull);  VERIFY (b == 950);
135}
136
137void
138compound_assignment_multiply_64 (void)
139{
140  decimal64 a (1000), b;
141
142  b = a; b.operator*=(d32);  VERIFY (b == 5000);
143  b = a; b.operator*=(d64);  VERIFY (b == -10000);
144  b = a; b.operator*=(d128); VERIFY (b == 25000);
145  b = a; b.operator*=(si);   VERIFY (b == -2000);
146  b = a; b.operator*=(ui);   VERIFY (b == 5000);
147  b = a; b.operator*=(sl);   VERIFY (b == -10000);
148  b = a; b.operator*=(ul);   VERIFY (b == 20000);
149  b = a; b.operator*=(sll);  VERIFY (b == -25000);
150  b = a; b.operator*=(ull);  VERIFY (b == 50000);
151}
152
153void
154compound_assignment_divide_64 (void)
155{
156  decimal64 a (1000), b;
157
158  b = a; b.operator/=(d32);  VERIFY (b == 200);
159  b = a; b.operator/=(d64);  VERIFY (b == -100);
160  b = a; b.operator/=(d128); VERIFY (b == 40);
161  b = a; b.operator/=(si);   VERIFY (b == -500);
162  b = a; b.operator/=(ui);   VERIFY (b == 200);
163  b = a; b.operator/=(sl);   VERIFY (b == -100);
164  b = a; b.operator/=(ul);   VERIFY (b == 50);
165  b = a; b.operator/=(sll);  VERIFY (b == -40);
166  b = a; b.operator/=(ull);  VERIFY (b == 20);
167}
168
169void
170compound_assignment_add_128 (void)
171{
172  decimal128 a (1000), b;
173
174  b = a; b.operator+=(d32);  VERIFY (b == 1005);
175  b = a; b.operator+=(d64);  VERIFY (b == 990);
176  b = a; b.operator+=(d128); VERIFY (b == 1025);
177  b = a; b.operator+=(si);   VERIFY (b == 998);
178  b = a; b.operator+=(ui);   VERIFY (b == 1005);
179  b = a; b.operator+=(sl);   VERIFY (b == 990);
180  b = a; b.operator+=(ul);   VERIFY (b == 1020);
181  b = a; b.operator+=(sll);  VERIFY (b == 975);
182  b = a; b.operator+=(ull);  VERIFY (b == 1050);
183}
184
185void
186compound_assignment_subtract_128 (void)
187{
188  decimal128 a (1000), b;
189
190  b = a; b.operator-=(d32);  VERIFY (b == 995);
191  b = a; b.operator-=(d64);  VERIFY (b == 1010);
192  b = a; b.operator-=(d128); VERIFY (b == 975);
193  b = a; b.operator-=(si);   VERIFY (b == 1002);
194  b = a; b.operator-=(ui);   VERIFY (b == 995);
195  b = a; b.operator-=(sl);   VERIFY (b == 1010);
196  b = a; b.operator-=(ul);   VERIFY (b == 980);
197  b = a; b.operator-=(sll);  VERIFY (b == 1025);
198  b = a; b.operator-=(ull);  VERIFY (b == 950);
199}
200
201void
202compound_assignment_multiply_128 (void)
203{
204  decimal128 a (1000), b;
205
206  b = a; b.operator*=(d32);  VERIFY (b == 5000);
207  b = a; b.operator*=(d64);  VERIFY (b == -10000);
208  b = a; b.operator*=(d128); VERIFY (b == 25000);
209  b = a; b.operator*=(si);   VERIFY (b == -2000);
210  b = a; b.operator*=(ui);   VERIFY (b == 5000);
211  b = a; b.operator*=(sl);   VERIFY (b == -10000);
212  b = a; b.operator*=(ul);   VERIFY (b == 20000);
213  b = a; b.operator*=(sll);  VERIFY (b == -25000);
214  b = a; b.operator*=(ull);  VERIFY (b == 50000);
215}
216
217void
218compound_assignment_divide_128 (void)
219{
220  decimal128 a (1000), b;
221
222  b = a; b.operator/=(d32);  VERIFY (b == 200);
223  b = a; b.operator/=(d64);  VERIFY (b == -100);
224  b = a; b.operator/=(d128); VERIFY (b == 40);
225  b = a; b.operator/=(si);   VERIFY (b == -500);
226  b = a; b.operator/=(ui);   VERIFY (b == 200);
227  b = a; b.operator/=(sl);   VERIFY (b == -100);
228  b = a; b.operator/=(ul);   VERIFY (b == 50);
229  b = a; b.operator/=(sll);  VERIFY (b == -40);
230  b = a; b.operator/=(ull);  VERIFY (b == 20);
231}
232
233int
234main ()
235{
236  compound_assignment_add_32 ();
237  compound_assignment_subtract_32 ();
238  compound_assignment_multiply_32 ();
239  compound_assignment_divide_32 ();
240
241  compound_assignment_add_64 ();
242  compound_assignment_subtract_64 ();
243  compound_assignment_multiply_64 ();
244  compound_assignment_divide_64 ();
245
246  compound_assignment_add_128 ();
247  compound_assignment_subtract_128 ();
248  compound_assignment_multiply_128 ();
249  compound_assignment_divide_128 ();
250}
251