diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2012-03-07 11:31:11 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2012-03-07 11:31:11 +0000 |
commit | ff12877a6f4db734cf0a156dc2ef815a839a79ec (patch) | |
tree | f3d604a186b651edc035101dce5ad2ccfd53a820 | |
parent | b53a1d67b13fa2f036e18180523ea336100e5240 (diff) | |
download | external_llvm-ff12877a6f4db734cf0a156dc2ef815a839a79ec.zip external_llvm-ff12877a6f4db734cf0a156dc2ef815a839a79ec.tar.gz external_llvm-ff12877a6f4db734cf0a156dc2ef815a839a79ec.tar.bz2 |
Attempt #2 at appeasing GCC 4.3. This compiler really doesn't like these
traits.
With this change, the pattern used here is *extremely* close to the
pattern used elsewhere in the file, so I'm hoping it survives the
build-bots.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152225 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Support/type_traits.h | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/include/llvm/Support/type_traits.h b/include/llvm/Support/type_traits.h index 3296c07..241883a 100644 --- a/include/llvm/Support/type_traits.h +++ b/include/llvm/Support/type_traits.h @@ -121,19 +121,15 @@ template <> struct is_integral_impl<unsigned long long> : true_type {}; template <typename T> struct is_integral : is_integral_impl<T> {}; -/// \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 <typename T> 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 <typename U, U u = U()> struct check1_return_type { char c[2]; }; - template <typename U> static check1_return_type<U> checker1(U*); - template <typename U> static char checker1(...); + template <typename U, U u = U()> struct check_nontype_temp_param_return_type { + char c[2]; + }; + template <typename U> + check_nontype_temp_param_return_type<U> check_nontype_temp_param(U*); + template <typename U> 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 <typename T> class is_integral_or_enum { // different compiler. struct nonce {}; template <typename U, nonce* u = U()> - struct check2_return_type { char c[2]; }; - template <typename U> static check2_return_type<U> checker2(U*); - template <typename U> static char checker2(...); + struct check_nullptr_t_like_return_type { char c[2]; }; + template <typename U> + check_nullptr_t_like_return_type<U> check_nullptr_t_like(U*); + template <typename U> 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 <typename T> struct is_integral_or_enum { enum { - value = (sizeof(char) != sizeof(checker1<T>(0)) && - sizeof(char) == sizeof(checker2<T>(0))) + value = (sizeof(char) != sizeof(dont_use::check_nontype_temp_param<T>(0)) && + sizeof(char) == sizeof(dont_use::check_nullptr_t_like<T>(0))) }; }; |