Fixed testing of 128bit integer types and added staic assert that cheks for std::numeric_limits specializations, if they are required for conversion (refs #8790)

[SVN r85072]
This commit is contained in:
Antony Polukhin
2013-07-18 08:45:09 +00:00
parent 91aa2ce64d
commit 13d98f02d0
2 changed files with 30 additions and 2 deletions

View File

@@ -879,6 +879,15 @@ namespace boost {
{ {
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS #ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed); BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
// GCC when used with flag -std=c++0x may not have std::numeric_limits
// specializations for __int128 and unsigned __int128 types.
// Try compilation with -std=gnu++0x or -std=gnu++11.
//
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40856
BOOST_STATIC_ASSERT_MSG(std::numeric_limits<T>::is_specialized,
"std::numeric_limits are not specialized for integral type passed to boost::lexical_cast"
);
#endif #endif
CharT const czero = lcast_char_constants<CharT>::zero; CharT const czero = lcast_char_constants<CharT>::zero;
--end; --end;

View File

@@ -558,14 +558,33 @@ void test_conversion_from_to_ulonglong()
#ifdef BOOST_LCAST_HAS_INT128 #ifdef BOOST_LCAST_HAS_INT128
template <bool Specialized, class T>
struct test_if_specialized {
static void test() {}
};
template <class T>
struct test_if_specialized<true, T> {
static void test() {
test_conversion_from_to_integral_minimal<T>();
}
};
void test_conversion_from_to_int128() void test_conversion_from_to_int128()
{ {
test_conversion_from_to_integral_minimal<boost::int128_type>(); test_if_specialized<
std::numeric_limits<boost::int128_type>::is_specialized,
boost::int128_type
>::test();
} }
void test_conversion_from_to_uint128() void test_conversion_from_to_uint128()
{ {
test_conversion_from_to_integral_minimal<boost::uint128_type>(); test_if_specialized<
std::numeric_limits<boost::int128_type>::is_specialized,
boost::uint128_type
>::test();
} }
#endif #endif