@@ -427,6 +427,67 @@ JSONTEST_FIXTURE( ValueTest, integers )
427427 JSONTEST_ASSERT ( double (kuint64max) == val.asDouble ());
428428 JSONTEST_ASSERT ( float (kuint64max) == val.asFloat ());
429429#else // ifdef JSON_NO_INT64
430+ // 2^40 (signed constructor arg)
431+ val = Json::Value (1LL << 40 );
432+
433+ checks = IsCheck ();
434+ checks.isInt_ = true ;
435+ checks.isNumeric_ = true ;
436+ checks.isIntegral_ = true ;
437+ JSONTEST_ASSERT_PRED ( checkIs ( val, checks ) );
438+
439+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asInt64 ());
440+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asLargestInt ());
441+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asUInt64 ());
442+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asLargestUInt ());
443+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asDouble ());
444+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asFloat ());
445+
446+ // 2^40 (unsigned constructor arg)
447+ val = Json::Value (1ULL << 40 );
448+
449+ checks = IsCheck ();
450+ checks.isUInt_ = true ;
451+ checks.isNumeric_ = true ;
452+ checks.isIntegral_ = true ;
453+ JSONTEST_ASSERT_PRED ( checkIs ( val, checks ) );
454+
455+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asInt64 ());
456+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asLargestInt ());
457+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asUInt64 ());
458+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asLargestUInt ());
459+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asDouble ());
460+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asFloat ());
461+
462+ // 2^40 (floating-point constructor arg)
463+ val = Json::Value ((1LL << 40 ) / 1.0 );
464+
465+ checks = IsCheck ();
466+ checks.isDouble_ = true ;
467+ checks.isNumeric_ = true ;
468+ JSONTEST_ASSERT_PRED ( checkIs ( val, checks ) );
469+
470+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asInt64 ());
471+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asLargestInt ());
472+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asUInt64 ());
473+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asLargestUInt ());
474+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asDouble ());
475+ JSONTEST_ASSERT ( (1LL << 40 ) == val.asFloat ());
476+
477+ // -2^40
478+ val = Json::Value (-(1LL << 40 ));
479+
480+ checks = IsCheck ();
481+ checks.isInt_ = true ;
482+ checks.isNumeric_ = true ;
483+ checks.isIntegral_ = true ;
484+ JSONTEST_ASSERT_PRED ( checkIs ( val, checks ) );
485+
486+ JSONTEST_ASSERT ( -(1LL << 40 ) == val.asInt64 ());
487+ JSONTEST_ASSERT ( -(1LL << 40 ) == val.asLargestInt ());
488+ JSONTEST_ASSERT ( -(1LL << 40 ) == val.asDouble ());
489+ JSONTEST_ASSERT ( -(1LL << 40 ) == val.asFloat ());
490+
430491 // int64 max
431492 val = Json::Value (Json::Int64 (kint64max));
432493
0 commit comments