Handle function name conflicts in _LIBCPP_MSVCRT mode

Visual Studio's SAL extension uses a macro named __deallocate. This macro is
used pervasively, and gets included through various different ways. This
conflicts with the similarly named interfaces in libc++. Introduce a undef
header similar to __undef_min_max to handle this. This fixes a number of errors
due to the macro replacing the function name.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@229162 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/__hash_table b/include/__hash_table
index 3a2de1d..71cf5fb 100644
--- a/include/__hash_table
+++ b/include/__hash_table
@@ -19,6 +19,7 @@
 #include <cmath>
 
 #include <__undef_min_max>
+#include <__undef___deallocate>
 
 #include <__debug>
 
diff --git a/include/__sso_allocator b/include/__sso_allocator
index 645f2ba..ca3b937 100644
--- a/include/__sso_allocator
+++ b/include/__sso_allocator
@@ -15,6 +15,8 @@
 #include <type_traits>
 #include <new>
 
+#include <__undef___deallocate>
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
 #endif
diff --git a/include/__undef___deallocate b/include/__undef___deallocate
new file mode 100644
index 0000000..2b4ad99
--- /dev/null
+++ b/include/__undef___deallocate
@@ -0,0 +1,18 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifdef __deallocate
+#if defined(_MSC_VER) && !defined(__clang__)
+_LIBCPP_WARNING("macro __deallocate is incompatible with C++.  #undefining __deallocate")
+#else
+#warning: macro __deallocate is incompatible with C++.  #undefining __deallocate
+#endif
+#undef __deallocate
+#endif
diff --git a/include/experimental/dynarray b/include/experimental/dynarray
index 0bc8dfe..a025862 100644
--- a/include/experimental/dynarray
+++ b/include/experimental/dynarray
@@ -104,6 +104,8 @@
 #include <new>
 #include <algorithm>
 
+#include <__undef___deallocate>
+
 #if defined(_LIBCPP_NO_EXCEPTIONS)
     #include <cassert>
 #endif
diff --git a/include/memory b/include/memory
index 40fc8ae..7085ced 100644
--- a/include/memory
+++ b/include/memory
@@ -615,6 +615,7 @@
 #endif
 
 #include <__undef_min_max>
+#include <__undef___deallocate>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
diff --git a/include/module.modulemap b/include/module.modulemap
index 6aeb23f..3c0700e 100644
--- a/include/module.modulemap
+++ b/include/module.modulemap
@@ -469,4 +469,5 @@
   module __tree { header "__tree" export * }
   module __tuple { header "__tuple" export * }
   module __undef_min_max { header "__undef_min_max" export * }
+  module __undef___deallocate { header "__undef___deallocate" export * }
 }
diff --git a/include/new b/include/new
index a710ed9..eebe5af 100644
--- a/include/new
+++ b/include/new
@@ -68,6 +68,8 @@
 #include <exception>
 #include <cstddef>
 
+#include <__undef___deallocate>
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
 #endif
diff --git a/include/valarray b/include/valarray
index 2b94204..bdaa588 100644
--- a/include/valarray
+++ b/include/valarray
@@ -348,6 +348,7 @@
 #include <new>
 
 #include <__undef_min_max>
+#include <__undef___deallocate>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header