summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-03-07 11:31:11 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-03-07 11:31:11 +0000
commitff12877a6f4db734cf0a156dc2ef815a839a79ec (patch)
treef3d604a186b651edc035101dce5ad2ccfd53a820
parentb53a1d67b13fa2f036e18180523ea336100e5240 (diff)
downloadllvm-ff12877a6f4db734cf0a156dc2ef815a839a79ec.tar.gz
llvm-ff12877a6f4db734cf0a156dc2ef815a839a79ec.tar.bz2
llvm-ff12877a6f4db734cf0a156dc2ef815a839a79ec.tar.xz
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.h38
1 files changed, 21 insertions, 17 deletions
diff --git a/include/llvm/Support/type_traits.h b/include/llvm/Support/type_traits.h
index 3296c070c0..241883a02c 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)))
};
};