diff --git a/include/llvm/Support/type_traits.h b/include/llvm/Support/type_traits.h index 3296c070c0f..241883a02cb 100644 --- a/include/llvm/Support/type_traits.h +++ b/include/llvm/Support/type_traits.h @@ -121,19 +121,15 @@ template <> struct is_integral_impl : true_type {}; template struct is_integral : is_integral_impl {}; -/// \brief Metafunction that determines whether the given type is either an -/// integral type or an enumeration type. -/// -/// Note that this accepts potentially more integral types than we whitelist -/// above for is_integral, it should accept essentially anything the compiler -/// believes is an integral type. -template class is_integral_or_enum { - +namespace dont_use { // Form a return type that can only be instantiated with an 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*); - template static char checker1(...); + template struct check_nontype_temp_param_return_type { + char c[2]; + }; + template + check_nontype_temp_param_return_type check_nontype_temp_param(U*); + template char check_nontype_temp_param(...); // 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 @@ -141,14 +137,22 @@ template class is_integral_or_enum { // different compiler. struct nonce {}; template - struct check2_return_type { char c[2]; }; - template static check2_return_type checker2(U*); - template static char checker2(...); + struct check_nullptr_t_like_return_type { char c[2]; }; + template + check_nullptr_t_like_return_type check_nullptr_t_like(U*); + template char check_nullptr_t_like(...); +} // namespace dont_use -public: +/// \brief Metafunction that determines whether the given type is either an +/// integral type or an enumeration type. +/// +/// Note that this accepts potentially more integral types than we whitelist +/// above for is_integral, it should accept essentially anything the compiler +/// believes is an integral type. +template struct is_integral_or_enum { enum { - value = (sizeof(char) != sizeof(checker1(0)) && - sizeof(char) == sizeof(checker2(0))) + value = (sizeof(char) != sizeof(dont_use::check_nontype_temp_param(0)) && + sizeof(char) == sizeof(dont_use::check_nullptr_t_like(0))) }; };