Thanks, this is much better. Though I actually had to add a pragma to silence the warning.
Committed revision 171167. Howard On Dec 25, 2012, at 11:55 AM, Saleem Abdulrasool <[email protected]> wrote: > When building for a system that has a 32-bit size_t, the sizeof(size_t) is 4, > which means that the the overflow for the 64-bit version is always false. > This > uses a template specialisation on the sizeof size_t to determine which > specialisation to use on the build target. Since building for a given target > will always have a single size of size_t, a single version is instantiated > now, > and the integral_constant<size_t, sizeof(size_t) * CHAR_BIT> is no longer > needed > to differentiate the invocation. Furthermore, because the 8 byte version is > no > longer instantiated on a 32-bit build, the tautological case no longer exists. > > This was pointed out by building with GCC (4.7.2). > > http://llvm-reviews.chandlerc.com/D243 > > Files: > src/hash.cpp > > Index: src/hash.cpp > =================================================================== > --- src/hash.cpp > +++ src/hash.cpp > @@ -10,6 +10,7 @@ > #include "__hash_table" > #include "algorithm" > #include "stdexcept" > +#include "type_traits" > > _LIBCPP_BEGIN_NAMESPACE_STD > > @@ -144,21 +145,21 @@ > // are fewer potential primes to search, and fewer potential primes to divide > // against. > > -inline _LIBCPP_INLINE_VISIBILITY > -void > -__check_for_overflow(size_t N, integral_constant<size_t, 32>) > +template <size_t _Sz = sizeof(size_t)> > +inline _LIBCPP_INLINE_VISIBILITY typename enable_if<_Sz == 4, void>::type > +__check_for_overflow(size_t N) > { > -#ifndef _LIBCPP_NO_EXCEPTIONS > +#ifndef _LIBCPP_NO_EXCEPTIONS > if (N > 0xFFFFFFFB) > throw overflow_error("__next_prime overflow"); > #endif > } > > -inline _LIBCPP_INLINE_VISIBILITY > -void > -__check_for_overflow(size_t N, integral_constant<size_t, 64>) > +template <size_t _Sz = sizeof(size_t)> > +inline _LIBCPP_INLINE_VISIBILITY typename enable_if<_Sz == 8, void>::type > +__check_for_overflow(size_t N) > { > -#ifndef _LIBCPP_NO_EXCEPTIONS > +#ifndef _LIBCPP_NO_EXCEPTIONS > if (N > 0xFFFFFFFFFFFFFFC5ull) > throw overflow_error("__next_prime overflow"); > #endif > @@ -174,8 +175,7 @@ > return *std::lower_bound(small_primes, small_primes + N, n); > // Else n > largest small_primes > // Check for overflow > - __check_for_overflow(n, integral_constant<size_t, > - sizeof(n) * > __CHAR_BIT__>()); > + __check_for_overflow(n); > // Start searching list of potential primes: L * k0 + indices[in] > const size_t M = sizeof(indices) / sizeof(indices[0]); > // Select first potential prime >= n > <D243.1.patch>_______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
