diff --git a/include/boost/lexical_cast.hpp b/include/boost/lexical_cast.hpp index e721882..acfc3e8 100644 --- a/include/boost/lexical_cast.hpp +++ b/include/boost/lexical_cast.hpp @@ -2077,8 +2077,9 @@ namespace boost { static inline Target lexical_cast_impl(const Source& arg) { typedef BOOST_DEDUCED_TYPENAME detail::array_to_pointer_decay::type src; + typedef BOOST_DEDUCED_TYPENAME ::boost::remove_cv::type no_cv_src; typedef BOOST_DEDUCED_TYPENAME detail::stream_char::type target_char_t; - typedef BOOST_DEDUCED_TYPENAME detail::stream_char::type src_char_type; + typedef BOOST_DEDUCED_TYPENAME detail::stream_char::type src_char_type; typedef BOOST_DEDUCED_TYPENAME detail::widest_char< target_char_t, src_char_type >::type char_type; @@ -2095,7 +2096,7 @@ namespace boost { #endif typedef BOOST_DEDUCED_TYPENAME ::boost::detail::deduce_char_traits< - char_type, Target, Source + char_type, Target, no_cv_src >::type traits; typedef ::boost::type_traits::ice_and< @@ -2106,8 +2107,8 @@ namespace boost { > is_string_widening_required_t; typedef ::boost::type_traits::ice_or< - ::boost::is_integral::value, - ::boost::detail::is_this_float_conversion_optimized::value, + ::boost::is_integral::value, + ::boost::detail::is_this_float_conversion_optimized::value, ::boost::detail::is_char_or_wchar::value > is_source_input_optimized_t; @@ -2123,7 +2124,7 @@ namespace boost { typedef detail::lexical_stream_limited_src interpreter_type; - typedef detail::lcast_src_length lcast_src_length; + typedef detail::lcast_src_length lcast_src_length; std::size_t const src_len = lcast_src_length::value; char_type buf[src_len + 1]; lcast_src_length::check_coverage(); diff --git a/lexical_cast_test.cpp b/lexical_cast_test.cpp index e7adc86..e12cfe7 100644 --- a/lexical_cast_test.cpp +++ b/lexical_cast_test.cpp @@ -73,6 +73,7 @@ void test_conversion_from_wstring(); void test_conversion_to_wstring(); void test_bad_lexical_cast(); void test_no_whitespace_stripping(); +void test_volatile_types_conversions(); #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION void test_traits(); void test_wtraits(); @@ -108,6 +109,7 @@ unit_test::test_suite *init_unit_test_suite(int, char *[]) #endif suite->add(BOOST_TEST_CASE(test_bad_lexical_cast)); suite->add(BOOST_TEST_CASE(test_no_whitespace_stripping)); + suite->add(BOOST_TEST_CASE(test_volatile_types_conversions)); #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION suite->add(BOOST_TEST_CASE(&test_traits)); suite->add(BOOST_TEST_CASE(&test_wtraits)); @@ -435,6 +437,17 @@ void test_no_whitespace_stripping() BOOST_CHECK_THROW(lexical_cast("123 "), bad_lexical_cast); } +void test_volatile_types_conversions() +{ + volatile int i1 = 100000; + BOOST_CHECK_EQUAL("100000", boost::lexical_cast(i1)); + + volatile const int i2 = 100000; + BOOST_CHECK_EQUAL("100000", boost::lexical_cast(i2)); + + volatile const long int i3 = 1000000; + BOOST_CHECK_EQUAL("1000000", boost::lexical_cast(i3)); +} #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION void test_traits()