[Allocator] Constrain the Deallocate templated overloads to only apply
authorChandler Carruth <chandlerc@gmail.com>
Tue, 15 Apr 2014 06:29:04 +0000 (06:29 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Tue, 15 Apr 2014 06:29:04 +0000 (06:29 +0000)
to types which we can compute the size of. The comparison with zero
isn't actually interesting here, it's mostly about putting sizeof into
a sfinae context.

This is particular important for Deallocate as otherwise the void*
overload can quickly become ambiguous.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206251 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Allocator.h

index 4da7acefb68c2d5e97afc5cf76499d4840b90daf..d96c8f254cc92fde54f2c3bf95af89cbfc2d9dda 100644 (file)
@@ -97,12 +97,15 @@ public:
   }
 
   /// \brief Deallocate space for one object without destroying it.
-  template <typename T> void Deallocate(T *Ptr) {
+  template <typename T>
+  typename std::enable_if<sizeof(T) != 0, void>::type Deallocate(T *Ptr) {
     Deallocate(static_cast<const void *>(Ptr));
   }
 
   /// \brief Allocate space for an array of objects without constructing them.
-  template <typename T> void Deallocate(T *Ptr, size_t /*Num*/) {
+  template <typename T>
+  typename std::enable_if<sizeof(T) != 0, void>::type
+  Deallocate(T *Ptr, size_t /*Num*/) {
     Deallocate(static_cast<const void *>(Ptr));
   }
 };