[llvm-commits] [llvm] r152225 - /llvm/trunk/include/llvm/Support/type_traits.h

Chandler Carruth chandlerc at gmail.com
Wed Mar 7 03:31:11 PST 2012


Author: chandlerc
Date: Wed Mar  7 05:31:11 2012
New Revision: 152225

URL: http://llvm.org/viewvc/llvm-project?rev=152225&view=rev
Log:
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.

Modified:
    llvm/trunk/include/llvm/Support/type_traits.h

Modified: llvm/trunk/include/llvm/Support/type_traits.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/type_traits.h?rev=152225&r1=152224&r2=152225&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/type_traits.h (original)
+++ llvm/trunk/include/llvm/Support/type_traits.h Wed Mar  7 05:31:11 2012
@@ -121,19 +121,15 @@
 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 @@
   // 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)))
   };
 };
 





More information about the llvm-commits mailing list