[cfe-commits] [PATCH] [libcxx] Fix a tautologically false case for 32-bit builds

Saleem Abdulrasool compnerd at compnerd.org
Tue Dec 25 08:55:45 PST 2012


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D243.1.patch
Type: text/x-patch
Size: 1704 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121225/92074ff4/attachment.bin>


More information about the cfe-commits mailing list