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