diff --git a/include/boost/charconv/detail/parser.hpp b/include/boost/charconv/detail/parser.hpp index 3e1a16ce..cf222ff5 100644 --- a/include/boost/charconv/detail/parser.hpp +++ b/include/boost/charconv/detail/parser.hpp @@ -170,7 +170,7 @@ inline from_chars_result parser(const char* first, const char* last, bool& sign, } // Next we get the significand - constexpr std::size_t significand_buffer_size = limits::max_chars10 - 1; // Base 10 or 16 + constexpr std::size_t significand_buffer_size = limits::max_chars10; // Base 10 or 16 char significand_buffer[significand_buffer_size] {}; std::size_t i = 0; std::size_t dot_position = 0; diff --git a/test/test_parser.cpp b/test/test_parser.cpp index 1ccdb648..281ef834 100644 --- a/test/test_parser.cpp +++ b/test/test_parser.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -38,6 +39,33 @@ void test_integer() auto r3 = boost::charconv::detail::parser(val2, val2 + std::strlen(val2), sign, significand, exponent, boost::charconv::chars_format::scientific); BOOST_TEST(r3.ec == std::errc::invalid_argument); + + // Get the maximum value of the significant type + constexpr auto max_sig_v = std::numeric_limits::max(); + char max_sig_buf[boost::charconv::limits::max_chars10 + 1u]; + const auto r4 = boost::charconv::to_chars(max_sig_buf + 1, max_sig_buf + sizeof(max_sig_buf), max_sig_v); + if (BOOST_TEST(r4)) { + + significand = 0; + exponent = 1; + sign = true; + + auto r5 = boost::charconv::detail::parser(max_sig_buf + 1, r4.ptr, sign, significand, exponent); + BOOST_TEST(r5); + BOOST_TEST_EQ(sign, false); + BOOST_TEST_EQ(exponent, 0); + BOOST_TEST_EQ(significand, max_sig_v); + + significand = 0; + exponent = 1; + sign = false; + max_sig_buf[0] = '-'; + auto r6 = boost::charconv::detail::parser(max_sig_buf, r4.ptr, sign, significand, exponent); + BOOST_TEST(r6); + BOOST_TEST_EQ(sign, true); + BOOST_TEST_EQ(exponent, 0); + BOOST_TEST_EQ(significand, max_sig_v); + } } template