Switch the is_integral_or_enum trait machinery to use an explicit
authorChandler Carruth <chandlerc@gmail.com>
Wed, 7 Mar 2012 10:05:35 +0000 (10:05 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 7 Mar 2012 10:05:35 +0000 (10:05 +0000)
template argument and an *implicit* conversion from '0' to a null
pointer. For some bizarre reason, GCC 4.3.2 thinks that the cast to
'(T*)' is invalid inside of an enumerator's value... which it isn't but
whatever. ;] This pattern is used elsewhere in the type_traits header
and so hopefully will survive the wrath of the build bots.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152220 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/type_traits.h

index a76344c098fe179fde5353f1aa03d0b44c7c7c95..3296c070c0f76fc75127fd8482eeb99f01ea18b8 100644 (file)
@@ -133,7 +133,7 @@ template <typename T> class is_integral_or_enum {
   // types (or with nullptr_t in C++11).
   template <typename U, U u = U()> struct check1_return_type { char c[2]; };
   template <typename U> static check1_return_type<U> checker1(U*);
-  static char checker1(...);
+  template <typename U> static char checker1(...);
 
   // Form a return type that can only be instantiated with nullptr_t in C++11
   // mode. It's harmless in C++98 mode, but this allows us to filter nullptr_t
@@ -143,12 +143,12 @@ template <typename T> class is_integral_or_enum {
   template <typename U, nonce* u = U()>
   struct check2_return_type { char c[2]; };
   template <typename U> static check2_return_type<U> checker2(U*);
-  static char checker2(...);
+  template <typename U> static char checker2(...);
 
 public:
   enum {
-    value = (sizeof(char) != sizeof(checker1((T*)0)) &&
-             sizeof(char) == sizeof(checker2((T*)0)))
+    value = (sizeof(char) != sizeof(checker1<T>(0)) &&
+             sizeof(char) == sizeof(checker2<T>(0)))
   };
 };