xref: /netbsd-src/external/lgpl3/gmp/dist/tests/cxx/t-ternary.cc (revision 72c7faa4dbb41dbb0238d6b4a109da0d4b236dd4)
1 /* Test mp*_class ternary expressions.
2 
3 Copyright 2001-2003 Free Software Foundation, Inc.
4 
5 This file is part of the GNU MP Library test suite.
6 
7 The GNU MP Library test suite is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 3 of the License,
10 or (at your option) any later version.
11 
12 The GNU MP Library test suite is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15 Public License for more details.
16 
17 You should have received a copy of the GNU General Public License along with
18 the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
19 
20 #include "config.h"
21 
22 #include <iostream>
23 
24 #include "gmpxx.h"
25 #include "gmp-impl.h"
26 #include "tests.h"
27 
28 using namespace std;
29 
30 
31 /* The various test cases are broken up into separate functions to keep down
32    compiler memory use.  They're static so that any mistakenly omitted from
33    main() will provoke warnings (under gcc -Wall at least).  */
34 
35 static void
check_mpz_1(void)36 check_mpz_1 (void)
37 {
38   // template<class Op1, class Op2>
39   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
40   // <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, Op1> >, Op2> >
41   {
42     mpz_class a(1), b(2), c(3);
43     mpz_class d;
44     d = a + b * c; ASSERT_ALWAYS(d == 7);
45   }
46   {
47     mpz_class a(1), b(2), c(3);
48     mpz_class d;
49     d = a - b * c; ASSERT_ALWAYS(d == -5);
50   }
51 }
52 
53 static void
check_mpz_2(void)54 check_mpz_2 (void)
55 {
56   // template <class T, class Op1, class Op2>
57   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
58   // <mpz_t, __gmp_binary_expr<mpz_class, T, Op1> >, Op2> >
59   {
60     mpz_class a(1), b(2);
61     signed int c = 3;
62     mpz_class d;
63     d = a + b * c; ASSERT_ALWAYS(d == 7);
64   }
65   {
66     mpz_class a(1), b(2);
67     signed int c = 3;
68     mpz_class d;
69     d = a - b * c; ASSERT_ALWAYS(d == -5);
70   }
71 }
72 
73 static void
check_mpz_3(void)74 check_mpz_3 (void)
75 {
76   // template <class T, class Op1, class Op2>
77   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
78   // <mpz_t, __gmp_binary_expr<T, mpz_class, Op1> >, Op2> >
79   {
80     mpz_class a(1), b(2);
81     unsigned int c = 3;
82     mpz_class d;
83     d = a + c * b; ASSERT_ALWAYS(d == 7);
84   }
85   {
86     mpz_class a(1), b(2);
87     unsigned int c = 3;
88     mpz_class d;
89     d = a - c * b; ASSERT_ALWAYS(d == -5);
90   }
91 }
92 
93 static void
check_mpz_4(void)94 check_mpz_4 (void)
95 {
96   // template <class T, class Op1, class Op2>
97   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
98   // <mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, T>, Op1> >, Op2> >
99   {
100     mpz_class a(1), b(2), c(3);
101     double d = 4.0;
102     mpz_class e;
103     e = a + b * (c + d); ASSERT_ALWAYS(e == 15);
104   }
105   {
106     mpz_class a(1), b(2), c(3);
107     double d = 4.0;
108     mpz_class e;
109     e = a - b * (c + d); ASSERT_ALWAYS(e == -13);
110   }
111 }
112 
113 static void
check_mpz_5(void)114 check_mpz_5 (void)
115 {
116   // template <class T, class Op1, class Op2>
117   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
118   // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, mpz_class, Op1> >, Op2> >
119   {
120     mpz_class a(1), b(2), c(3);
121     signed int d = 4;
122     mpz_class e;
123     e = a + (b - d) * c; ASSERT_ALWAYS(e == -5);
124   }
125   {
126     mpz_class a(1), b(2), c(3);
127     signed int d = 4;
128     mpz_class e;
129     e = a - (b - d) * c; ASSERT_ALWAYS(e == 7);
130   }
131 }
132 
133 static void
check_mpz_6(void)134 check_mpz_6 (void)
135 {
136   // template <class T, class U, class Op1, class Op2>
137   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
138   // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, U, Op1> >, Op2> >
139   {
140     mpz_class a(1), b(2);
141     unsigned int c = 3, d = 4;
142     mpz_class e;
143     e = a + (b + c) * d; ASSERT_ALWAYS(e == 21);
144   }
145   {
146     mpz_class a(1), b(2);
147     unsigned int c = 3, d = 4;
148     mpz_class e;
149     e = a - (b + c) * d; ASSERT_ALWAYS(e == -19);
150   }
151 }
152 
153 static void
check_mpz_7(void)154 check_mpz_7 (void)
155 {
156   // template <class T, class U, class Op1, class Op2>
157   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
158   // <mpz_t, __gmp_binary_expr<T, __gmp_expr<mpz_t, U>, Op1> >, Op2> >
159   {
160     mpz_class a(1), b(2);
161     double c = 3.0, d = 4.0;
162     mpz_class e;
163     e = a + c * (b + d); ASSERT_ALWAYS(e == 19);
164   }
165   {
166     mpz_class a(1), b(2);
167     double c = 3.0, d = 4.0;
168     mpz_class e;
169     e = a - c * (b + d); ASSERT_ALWAYS(e == -17);
170   }
171 }
172 
173 static void
check_mpz_8(void)174 check_mpz_8 (void)
175 {
176   // template <class T, class U, class Op1, class Op2>
177   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
178   // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>,
179   // Op1> >, Op2> >
180   {
181     mpz_class a(1), b(2), c(3);
182     signed int d = 4, e = 5;
183     mpz_class f;
184     f = a + (b - d) * (c + e); ASSERT_ALWAYS(f == -15);
185   }
186   {
187     mpz_class a(1), b(2), c(3);
188     signed int d = 4, e = 5;
189     mpz_class f;
190     f = a - (b - d) * (c + e); ASSERT_ALWAYS(f == 17);
191   }
192 }
193 
194 static void
check_mpz_9(void)195 check_mpz_9 (void)
196 {
197   // template <class T, class Op1, class Op2>
198   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,
199   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, mpz_class, Op1> >, Op2> >
200   {
201     mpz_class a(1), b(2), c(3);
202     unsigned int d = 4;
203     mpz_class e;
204     e = (a + d) + b * c; ASSERT_ALWAYS(e == 11);
205   }
206   {
207     mpz_class a(1), b(2), c(3);
208     unsigned int d = 4;
209     mpz_class e;
210     e = (a + d) - b * c; ASSERT_ALWAYS(e == -1);
211   }
212 }
213 
214 static void
check_mpz_10(void)215 check_mpz_10 (void)
216 {
217   // template <class T, class U, class Op1, class Op2>
218   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,
219   // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, U, Op1> >, Op2> >
220   {
221     mpz_class a(1), b(2);
222     double c = 3.0, d = 4.0;
223     mpz_class e;
224     e = (a - c) + b * d; ASSERT_ALWAYS(e == 6);
225   }
226   {
227     mpz_class a(1), b(2);
228     double c = 3.0, d = 4.0;
229     mpz_class e;
230     e = (a - c) - b * d; ASSERT_ALWAYS(e == -10);
231   }
232 }
233 
234 static void
check_mpz_11(void)235 check_mpz_11 (void)
236 {
237   // template <class T, class U, class Op1, class Op2>
238   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,
239   // __gmp_expr<mpz_t, __gmp_binary_expr<U, mpz_class, Op1> >, Op2> >
240   {
241     mpz_class a(1), b(2);
242     signed int c = 3, d = 4;
243     mpz_class e;
244     e = (a - c) + d * b; ASSERT_ALWAYS(e == 6);
245   }
246   {
247     mpz_class a(1), b(2);
248     signed int c = 3, d = 4;
249     mpz_class e;
250     e = (a - c) - d * b; ASSERT_ALWAYS(e == -10);
251   }
252 }
253 
254 static void
check_mpz_12(void)255 check_mpz_12 (void)
256 {
257   // template <class T, class U, class Op1, class Op2>
258   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
259   // <mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, U>, Op1> >, Op2> >
260   {
261     mpz_class a(1), b(2), c(3);
262     unsigned int d = 4, e = 5;
263     mpz_class f;
264     f = (a + d) + b * (c - e); ASSERT_ALWAYS(f == 1);
265   }
266   {
267     mpz_class a(1), b(2), c(3);
268     unsigned int d = 4, e = 5;
269     mpz_class f;
270     f = (a + d) - b * (c - e); ASSERT_ALWAYS(f == 9);
271   }
272 }
273 
274 static void
check_mpz_13(void)275 check_mpz_13 (void)
276 {
277   // template <class T, class U, class Op1, class Op2>
278   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
279   // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, mpz_class, Op1> >, Op2> >
280   {
281     mpz_class a(1), b(2), c(3);
282     double d = 4.0, e = 5.0;
283     mpz_class f;
284     f = (a - d) + (b + e) * c; ASSERT_ALWAYS(f == 18);
285   }
286   {
287     mpz_class a(1), b(2), c(3);
288     double d = 4.0, e = 5.0;
289     mpz_class f;
290     f = (a - d) - (b + e) * c; ASSERT_ALWAYS(f == -24);
291   }
292 
293 }
294 
295 static void
check_mpz_14(void)296 check_mpz_14 (void)
297 {
298   // template <class T, class U, class V, class Op1, class Op2>
299   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
300   // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, V, Op1> >, Op2> >
301   {
302     mpz_class a(1), b(2);
303     signed int c = 3, d = 4, e = 5;
304     mpz_class f;
305     f = (a + c) + (b + d) * e; ASSERT_ALWAYS(f == 34);
306   }
307   {
308     mpz_class a(1), b(2);
309     signed int c = 3, d = 4, e = 5;
310     mpz_class f;
311     f = (a + c) - (b + d) * e; ASSERT_ALWAYS(f == -26);
312   }
313 }
314 
315 static void
check_mpz_15(void)316 check_mpz_15 (void)
317 {
318   // template <class T, class U, class V, class Op1, class Op2>
319   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
320   // <mpz_t, __gmp_binary_expr<U, __gmp_expr<mpz_t, V>, Op1> >, Op2> >
321   {
322     mpz_class a(1), b(2);
323     unsigned int c = 3, d = 4, e = 5;
324     mpz_class f;
325     f = (a - c) + d * (b - e); ASSERT_ALWAYS(f == -14);
326   }
327   {
328     mpz_class a(1), b(2);
329     unsigned int c = 3, d = 4, e = 5;
330     mpz_class f;
331     f = (a - c) - d * (b - e); ASSERT_ALWAYS(f == 10);
332   }
333 
334 }
335 
336 static void
check_mpz_16(void)337 check_mpz_16 (void)
338 {
339   // template <class T, class U, class V, class Op1, class Op2>
340   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
341   // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, __gmp_expr<mpz_t, V>,
342   // Op1> >, Op2> >
343   {
344     mpz_class a(1), b(2), c(3);
345     double d = 4.0, e = 5.0, f = 6.0;
346     mpz_class g;
347     g = (a + d) + (b - e) * (c + f); ASSERT_ALWAYS(g == -22);
348   }
349   {
350     mpz_class a(1), b(2), c(3);
351     double d = 4.0, e = 5.0, f = 6.0;
352     mpz_class g;
353     g = (a + d) - (b - e) * (c + f); ASSERT_ALWAYS(g == 32);
354   }
355 }
356 
357 static void
check_mpz_17(void)358 check_mpz_17 (void)
359 {
360   // template <class Op1, class Op2>
361   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr
362   // <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, Op1> >, mpz_class, Op2> >
363   {
364     mpz_class a(2), b(3), c(4);
365     mpz_class d;
366     d = a * b + c; ASSERT_ALWAYS(d == 10);
367   }
368   {
369     mpz_class a(2), b(3), c(4);
370     mpz_class d;
371     d = a * b - c; ASSERT_ALWAYS(d == 2);
372   }
373 }
374 
375 static void
check_mpz_18(void)376 check_mpz_18 (void)
377 {
378   // template <class T, class Op1, class Op2>
379   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr
380   // <mpz_t, __gmp_binary_expr<mpz_class, T, Op1> >, mpz_class, Op2> >
381   {
382     mpz_class a(2), b(3);
383     signed int c = 4;
384     mpz_class d;
385     d = a * c + b; ASSERT_ALWAYS(d == 11);
386   }
387   {
388     mpz_class a(2), b(3);
389     signed int c = 4;
390     mpz_class d;
391     d = a * c - b; ASSERT_ALWAYS(d == 5);
392   }
393 
394 }
395 
396 static void
check_mpz_19(void)397 check_mpz_19 (void)
398 {
399   // template <class T, class Op1, class Op2>
400   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr
401   // <mpz_t, __gmp_binary_expr<T, mpz_class, Op1> >, mpz_class, Op2> >
402   {
403     mpz_class a(2), b(3);
404     unsigned int c = 4;
405     mpz_class d;
406     d = c * a + b; ASSERT_ALWAYS(d == 11);
407   }
408   {
409     mpz_class a(2), b(3);
410     unsigned int c = 4;
411     mpz_class d;
412     d = c * a - b; ASSERT_ALWAYS(d == 5);
413   }
414 }
415 
416 static void
check_mpz_20(void)417 check_mpz_20 (void)
418 {
419   // template <class T, class Op1, class Op2>
420   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
421   // <mpz_class, __gmp_expr<mpz_t, T>, Op1> >, mpz_class, Op2> >
422   {
423     mpz_class a(2), b(3), c(4);
424     double d = 5.0;
425     mpz_class e;
426     e = a * (b + d) + c; ASSERT_ALWAYS(e == 20);
427   }
428   {
429     mpz_class a(2), b(3), c(4);
430     double d = 5.0;
431     mpz_class e;
432     e = a * (b + d) - c; ASSERT_ALWAYS(e == 12);
433   }
434 }
435 
436 static void
check_mpz_21(void)437 check_mpz_21 (void)
438 {
439   // template <class T, class Op1, class Op2>
440   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
441   // <__gmp_expr<mpz_t, T>, mpz_class, Op1> >, mpz_class, Op2> >
442   {
443     mpz_class a(2), b(3), c(4);
444     signed int d = 5;
445     mpz_class e;
446     e = (a - d) * b + c; ASSERT_ALWAYS(e == -5);
447   }
448   {
449     mpz_class a(2), b(3), c(4);
450     signed int d = 5;
451     mpz_class e;
452     e = (a - d) * b - c; ASSERT_ALWAYS(e == -13);
453   }
454 }
455 
456 static void
check_mpz_22(void)457 check_mpz_22 (void)
458 {
459   // template <class T, class U, class Op1, class Op2>
460   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
461   // <__gmp_expr<mpz_t, T>, U, Op1> >, mpz_class, Op2> >
462   {
463     mpz_class a(2), b(3);
464     unsigned int c = 4, d = 5;
465     mpz_class e;
466     e = (a + c) * d + b; ASSERT_ALWAYS(e == 33);
467   }
468   {
469     mpz_class a(2), b(3);
470     unsigned int c = 4, d = 5;
471     mpz_class e;
472     e = (a + c) * d - b; ASSERT_ALWAYS(e == 27);
473   }
474 }
475 
476 static void
check_mpz_23(void)477 check_mpz_23 (void)
478 {
479   // template <class T, class U, class Op1, class Op2>
480   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
481   // <T, __gmp_expr<mpz_t, U>, Op1> >, mpz_class, Op2> >
482   {
483     mpz_class a(2), b(3);
484     double c = 4.0, d = 5.0;
485     mpz_class e;
486     e = c * (a + d) + b; ASSERT_ALWAYS(e == 31);
487   }
488   {
489     mpz_class a(2), b(3);
490     double c = 4.0, d = 5.0;
491     mpz_class e;
492     e = c * (a + d) - b; ASSERT_ALWAYS(e == 25);
493   }
494 
495 }
496 
497 static void
check_mpz_24(void)498 check_mpz_24 (void)
499 {
500   // template <class T, class U, class Op1, class Op2>
501   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
502   // <__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, Op1> >, mpz_class, Op2> >
503   {
504     mpz_class a(2), b(3), c(4);
505     signed int d = 5, e = 6;
506     mpz_class f;
507     f = (a - d) * (b + e) + c; ASSERT_ALWAYS(f == -23);
508   }
509   {
510     mpz_class a(2), b(3), c(4);
511     signed int d = 5, e = 6;
512     mpz_class f;
513     f = (a - d) * (b + e) - c; ASSERT_ALWAYS(f == -31);
514   }
515 }
516 
517 static void
check_mpz_25(void)518 check_mpz_25 (void)
519 {
520   // template <class T, class Op1, class Op2>
521   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
522   // <mpz_class, mpz_class, Op1> >, __gmp_expr<mpz_t, T>, Op2> >
523   {
524     mpz_class a(2), b(3), c(4);
525     unsigned int d = 5;
526     mpz_class e;
527     e = a * b + (c - d); ASSERT_ALWAYS(e == 5);
528   }
529   {
530     mpz_class a(2), b(3), c(4);
531     unsigned int d = 5;
532     mpz_class e;
533     e = a * b - (c - d); ASSERT_ALWAYS(e == 7);
534   }
535 }
536 
537 static void
check_mpz_26(void)538 check_mpz_26 (void)
539 {
540   // template <class T, class U, class Op1, class Op2>
541   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
542   // <mpz_class, T, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
543   {
544     mpz_class a(2), b(3);
545     double c = 4.0, d = 5.0;
546     mpz_class e;
547     e = a * c + (b + d); ASSERT_ALWAYS(e == 16);
548   }
549   {
550     mpz_class a(2), b(3);
551     double c = 4.0, d = 5.0;
552     mpz_class e;
553     e = a * c - (b + d); ASSERT_ALWAYS(e == 0);
554   }
555 }
556 
557 static void
check_mpz_27(void)558 check_mpz_27 (void)
559 {
560   // template <class T, class U, class Op1, class Op2>
561   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
562   // <T, mpz_class, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
563   {
564     mpz_class a(2), b(3);
565     signed int c = 4, d = 5;
566     mpz_class e;
567     e = c * a + (b - d); ASSERT_ALWAYS(e == 6);
568   }
569   {
570     mpz_class a(2), b(3);
571     signed int c = 4, d = 5;
572     mpz_class e;
573     e = c * a - (b - d); ASSERT_ALWAYS(e == 10);
574   }
575 }
576 
577 static void
check_mpz_28(void)578 check_mpz_28 (void)
579 {
580   // template <class T, class U, class Op1, class Op2>
581   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
582   // <mpz_class, __gmp_expr<mpz_t, T>, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
583   {
584     mpz_class a(2), b(3), c(4);
585     unsigned int d = 5, e = 6;
586     mpz_class f;
587     f = a * (b - d) + (c + e); ASSERT_ALWAYS(f == 6);
588   }
589   {
590     mpz_class a(2), b(3), c(4);
591     unsigned int d = 5, e = 6;
592     mpz_class f;
593     f = a * (b - d) - (c + e); ASSERT_ALWAYS(f == -14);
594   }
595 }
596 
597 static void
check_mpz_29(void)598 check_mpz_29 (void)
599 {
600   // template <class T, class U, class Op1, class Op2>
601   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
602   // <__gmp_expr<mpz_t, T>, mpz_class, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
603   {
604     mpz_class a(2), b(3), c(4);
605     double d = 5.0, e = 6.0;
606     mpz_class f;
607     f = (a + d) * b + (c - e); ASSERT_ALWAYS(f == 19);
608   }
609   {
610     mpz_class a(2), b(3), c(4);
611     double d = 5.0, e = 6.0;
612     mpz_class f;
613     f = (a + d) * b - (c - e); ASSERT_ALWAYS(f == 23);
614   }
615 }
616 
617 static void
check_mpz_30(void)618 check_mpz_30 (void)
619 {
620   // template <class T, class U, class V, class Op1, class Op2>
621   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
622   // <__gmp_expr<mpz_t, T>, U, Op1> >, __gmp_expr<mpz_t, V>, Op2> >
623   {
624     mpz_class a(2), b(3);
625     signed int c = 4, d = 5, e = 6;
626     mpz_class f;
627     f = (a + c) * d + (b + e); ASSERT_ALWAYS(f == 39);
628   }
629   {
630     mpz_class a(2), b(3);
631     signed int c = 4, d = 5, e = 6;
632     mpz_class f;
633     f = (a + c) * d - (b + e); ASSERT_ALWAYS(f == 21);
634   }
635 }
636 
637 static void
check_mpz_31(void)638 check_mpz_31 (void)
639 {
640   // template <class T, class U, class V, class Op1, class Op2>
641   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
642   // <T, __gmp_expr<mpz_t, U>, Op1> >, __gmp_expr<mpz_t, V>, Op2> >
643   {
644     mpz_class a(2), b(3);
645     unsigned int c = 4, d = 5, e = 6;
646     mpz_class f;
647     f = c * (a + d) + (b - e); ASSERT_ALWAYS(f == 25);
648   }
649   {
650     mpz_class a(2), b(3);
651     unsigned int c = 4, d = 5, e = 6;
652     mpz_class f;
653     f = c * (a + d) - (b - e); ASSERT_ALWAYS(f == 31);
654   }
655 }
656 
657 static void
check_mpz_32(void)658 check_mpz_32 (void)
659 {
660   // template <class T, class U, class V, class Op1, class Op2>
661   // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
662   // <__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, Op1> >,
663   // __gmp_expr<mpz_t, V>, Op2> >
664   {
665     mpz_class a(2), b(3), c(4);
666     double d = 5.0, e = 6.0, f = 7.0;
667     mpz_class g;
668     g = (a + d) * (b - e) + (c + f); ASSERT_ALWAYS(g == -10);
669   }
670   {
671     mpz_class a(2), b(3), c(4);
672     double d = 5.0, e = 6.0, f = 7.0;
673     mpz_class g;
674     g = (a + d) * (b - e) - (c + f); ASSERT_ALWAYS(g == -32);
675   }
676 }
677 
678 void
check_mpq(void)679 check_mpq (void)
680 {
681   // currently there's no ternary mpq operation
682 }
683 
684 void
check_mpf(void)685 check_mpf (void)
686 {
687   // currently there's no ternary mpf operation
688 }
689 
690 
691 int
main(void)692 main (void)
693 {
694   tests_start();
695 
696   check_mpz_1 ();
697   check_mpz_2 ();
698   check_mpz_3 ();
699   check_mpz_4 ();
700   check_mpz_5 ();
701   check_mpz_6 ();
702   check_mpz_7 ();
703   check_mpz_8 ();
704   check_mpz_9 ();
705   check_mpz_10 ();
706   check_mpz_11 ();
707   check_mpz_12 ();
708   check_mpz_13 ();
709   check_mpz_14 ();
710   check_mpz_15 ();
711   check_mpz_16 ();
712   check_mpz_17 ();
713   check_mpz_18 ();
714   check_mpz_19 ();
715   check_mpz_20 ();
716   check_mpz_21 ();
717   check_mpz_22 ();
718   check_mpz_23 ();
719   check_mpz_24 ();
720   check_mpz_25 ();
721   check_mpz_26 ();
722   check_mpz_27 ();
723   check_mpz_28 ();
724   check_mpz_29 ();
725   check_mpz_30 ();
726   check_mpz_31 ();
727   check_mpz_32 ();
728 
729   check_mpq();
730   check_mpf();
731 
732   tests_end();
733   return 0;
734 }
735