@@ -535,19 +535,17 @@ struct bigint : pow5_tables<> {
535535 // we can't shift more than the capacity of the vector.
536536 return false ;
537537 }
538- if (vec.is_empty ()) {
539- // nothing to do
540- return true ;
538+ if (!vec.is_empty ()) {
539+ // move limbs
540+ limb *dst = vec.data + n;
541+ limb const *src = vec.data ;
542+ std::copy_backward (src, src + vec.len (), dst + vec.len ());
543+ // fill in empty limbs
544+ limb *first = vec.data ;
545+ limb *last = first + n;
546+ ::std::fill (first, last, 0 );
547+ vec.set_len (limb_t (n + vec.len ()));
541548 }
542- // move limbs
543- limb *dst = vec.data + n;
544- limb const *src = vec.data ;
545- std::copy_backward (src, src + vec.len (), dst + vec.len ());
546- // fill in empty limbs
547- limb *first = vec.data ;
548- limb *last = first + n;
549- ::std::fill (first, last, 0 );
550- vec.set_len (limb_t (n + vec.len ()));
551549 return true ;
552550 }
553551
@@ -590,12 +588,14 @@ struct bigint : pow5_tables<> {
590588 FASTFLOAT_CONSTEXPR20 bool add (limb y) noexcept { return small_add (vec, y); }
591589
592590 // multiply as if by 2 raised to a power.
593- FASTFLOAT_CONSTEXPR20 bool pow2 (am_pow_t exp) noexcept {
591+ FASTFLOAT_CONSTEXPR20 bool pow2 (am_pow_t const exp) noexcept {
592+ FASTFLOAT_ASSERT (exp >= 0 );
594593 return shl (static_cast <fast_float::bigint_bits_t >(exp));
595594 }
596595
597596 // multiply as if by 5 raised to a power.
598597 FASTFLOAT_CONSTEXPR20 bool pow5 (am_pow_t exp) noexcept {
598+ FASTFLOAT_ASSERT (exp >= 0 );
599599 // multiply by a power of 5
600600 limb_t const large_length = sizeof (large_power_of_5) / sizeof (limb);
601601 limb_span const large = limb_span (large_power_of_5, large_length);
@@ -627,6 +627,7 @@ struct bigint : pow5_tables<> {
627627
628628 // multiply as if by 10 raised to a power.
629629 FASTFLOAT_CONSTEXPR20 bool pow10 (am_pow_t exp) noexcept {
630+ FASTFLOAT_ASSERT (exp >= 0 );
630631 FASTFLOAT_TRY (pow5 (exp));
631632 return pow2 (exp);
632633 }
0 commit comments