From: Chandler Carruth Date: Wed, 7 Mar 2012 10:05:35 +0000 (+0000) Subject: Switch the is_integral_or_enum trait machinery to use an explicit X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a1eb50fe3d8213156c77ef2f7ae5c4ad629dbb95;p=oota-llvm.git Switch the is_integral_or_enum trait machinery to use an explicit 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 --- diff --git a/include/llvm/Support/type_traits.h b/include/llvm/Support/type_traits.h index a76344c098f..3296c070c0f 100644 --- a/include/llvm/Support/type_traits.h +++ b/include/llvm/Support/type_traits.h @@ -133,7 +133,7 @@ template class is_integral_or_enum { // types (or with nullptr_t in C++11). template struct check1_return_type { char c[2]; }; template static check1_return_type checker1(U*); - static char checker1(...); + template 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 class is_integral_or_enum { template struct check2_return_type { char c[2]; }; template static check2_return_type checker2(U*); - static char checker2(...); + template static char checker2(...); public: enum { - value = (sizeof(char) != sizeof(checker1((T*)0)) && - sizeof(char) == sizeof(checker2((T*)0))) + value = (sizeof(char) != sizeof(checker1(0)) && + sizeof(char) == sizeof(checker2(0))) }; };