File tree 2 files changed +28
-5
lines changed
2 files changed +28
-5
lines changed Original file line number Diff line number Diff line change @@ -293,6 +293,19 @@ void tst_int_min_bug() {
293
293
m.del (r);
294
294
}
295
295
296
+ void tst_int64_min_bug () {
297
+ synch_mpz_manager m;
298
+ mpz intmin;
299
+ mpz test;
300
+ m.set (test, " -9223372036854775808" );
301
+ m.set (intmin, std::numeric_limits<int64_t >::min ());
302
+ std::cout << " minint: " << m.to_string (intmin) << " \n " ;
303
+ ENSURE (m.eq (test, intmin));
304
+ m.del (intmin);
305
+ m.del (test);
306
+ }
307
+
308
+
296
309
void tst_scoped () {
297
310
synch_mpz_manager m;
298
311
scoped_synch_mpz a (m);
@@ -504,6 +517,7 @@ void tst_mpz() {
504
517
// tst_gcd();
505
518
tst_scoped ();
506
519
tst_int_min_bug ();
520
+ tst_int64_min_bug ();
507
521
bug4 ();
508
522
bug3 ();
509
523
bug1 ();
Original file line number Diff line number Diff line change @@ -272,7 +272,12 @@ void mpz_manager<SYNCH>::set_big_i64(mpz & c, int64_t v) {
272
272
c.m_kind = mpz_large;
273
273
SASSERT (capacity (c) >= m_init_cell_capacity);
274
274
uint64_t _v;
275
- if (v < 0 ) {
275
+ if (v == std::numeric_limits<int64_t >::min ()) {
276
+ // min-int is even
277
+ _v = -(v/2 );
278
+ c.m_val = -1 ;
279
+ }
280
+ else if (v < 0 ) {
276
281
_v = -v;
277
282
c.m_val = -1 ;
278
283
}
@@ -298,14 +303,15 @@ void mpz_manager<SYNCH>::set_big_i64(mpz & c, int64_t v) {
298
303
}
299
304
c.m_kind = mpz_large;
300
305
uint64_t _v;
301
- bool sign;
302
- if (v < 0 ) {
306
+ bool sign = v < 0 ;
307
+ if (v == std::numeric_limits<int64_t >::min ()) {
308
+ _v = -(v/2 );
309
+ }
310
+ else if (v < 0 ) {
303
311
_v = -v;
304
- sign = true ;
305
312
}
306
313
else {
307
314
_v = v;
308
- sign = false ;
309
315
}
310
316
mpz_set_ui (*c.m_ptr , static_cast <unsigned >(_v));
311
317
MPZ_BEGIN_CRITICAL ();
@@ -316,6 +322,9 @@ void mpz_manager<SYNCH>::set_big_i64(mpz & c, int64_t v) {
316
322
if (sign)
317
323
mpz_neg (*c.m_ptr , *c.m_ptr );
318
324
#endif
325
+ if (v == std::numeric_limits<int64_t >::min ()) {
326
+ big_add (c, c, c);
327
+ }
319
328
}
320
329
321
330
template <bool SYNCH>
You can’t perform that action at this time.
0 commit comments