G M: Provides the _LIBCPP_WARNING macro, to be used for MSVC only, since that compiler doesn't support #warning.

llvm-svn: 191980
diff --git a/libcxx/include/__config b/libcxx/include/__config
index dead4c6..b0d4a7b 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -79,6 +79,9 @@
 #  endif
 #  if defined(_MSC_VER) && !defined(__clang__)
 #    define _LIBCPP_MSVC // Using Microsoft Visual C++ compiler
+#    define _LIBCPP_TOSTRING2(x) #x
+#    define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x)
+#    define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x))
 #  endif
 #  // If mingw not explicitly detected, assume using MS C runtime only.
 #  ifndef __MINGW32__
diff --git a/libcxx/include/__undef_min_max b/libcxx/include/__undef_min_max
index b1e80d1..2b6bc90 100644
--- a/libcxx/include/__undef_min_max
+++ b/libcxx/include/__undef_min_max
@@ -9,11 +9,19 @@
 //===----------------------------------------------------------------------===//
 
 #ifdef min
+#if defined(_MSC_VER) && ! defined(__clang__)
+_LIBCPP_WARNING("macro min is incompatible with C++.  #undefing min")
+#else
 #warning: macro min is incompatible with C++.  #undefing min
+#endif
 #undef min
 #endif
 
 #ifdef max
+#if defined(_MSC_VER) && ! defined(__clang__)
+_LIBCPP_WARNING("macro max is incompatible with C++.  #undefing max")
+#else
 #warning: macro max is incompatible with C++.  #undefing max
+#endif
 #undef max
 #endif
diff --git a/libcxx/include/ext/hash_map b/libcxx/include/ext/hash_map
index b57ea53..225b72b 100644
--- a/libcxx/include/ext/hash_map
+++ b/libcxx/include/ext/hash_map
@@ -206,7 +206,11 @@
 #include <ext/__hash>
 
 #if __DEPRECATED
-#warning Use of the header <ext/hash_map> is deprecated.  Migrate to <unordered_map>
+#if defined(_MSC_VER) && ! defined(__clang__)
+    _LIBCPP_WARNING("Use of the header <ext/hash_map> is deprecated.  Migrate to <unordered_map>")
+#else
+#   warning Use of the header <ext/hash_map> is deprecated.  Migrate to <unordered_map>
+#endif
 #endif
 
 #pragma GCC system_header
diff --git a/libcxx/include/ext/hash_set b/libcxx/include/ext/hash_set
index deffcb6..c4bb898 100644
--- a/libcxx/include/ext/hash_set
+++ b/libcxx/include/ext/hash_set
@@ -199,7 +199,11 @@
 #include <ext/__hash>
 
 #if __DEPRECATED
-#warning Use of the header <ext/hash_set> is deprecated.  Migrate to <unordered_set>
+#if defined(_MSC_VER) && ! defined(__clang__)
+    _LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated.  Migrate to <unordered_set>")
+#else
+#   warning Use of the header <ext/hash_set> is deprecated.  Migrate to <unordered_set>
+#endif
 #endif
 
 namespace __gnu_cxx {
diff --git a/libcxx/src/exception.cpp b/libcxx/src/exception.cpp
index d3e1b29..dc6d049 100644
--- a/libcxx/src/exception.cpp
+++ b/libcxx/src/exception.cpp
@@ -1,3 +1,5 @@
+
+
 //===------------------------ exception.cpp -------------------------------===//
 //
 //                     The LLVM Compiler Infrastructure
@@ -39,6 +41,13 @@
   static std::unexpected_handler __unexpected_handler;
 #endif // __has_include(<cxxabi.h>)
 
+_LIBCPP_NORETURN
+static void _libcpp_abort(const char* msg)
+{
+    printf("%s\n", msg);
+    abort();
+}
+
 namespace std
 {
 
@@ -89,15 +98,13 @@
 #endif  // _LIBCPP_NO_EXCEPTIONS
         (*get_terminate())();
         // handler should not return
-        printf("terminate_handler unexpectedly returned\n");
-        ::abort ();
+        _libcpp_abort("terminate_handler unexpectedly returned\n");
 #ifndef _LIBCPP_NO_EXCEPTIONS
     }
     catch (...)
     {
         // handler should not throw exception
-        printf("terminate_handler unexpectedly threw an exception\n");
-        ::abort ();
+        _libcpp_abort("terminate_handler unexpectedly threw an exception\n");
     }
 #endif  // _LIBCPP_NO_EXCEPTIONS
 }
@@ -111,12 +118,16 @@
     // on Darwin, there is a helper function so __cxa_get_globals is private
     return __cxa_uncaught_exception();
 #else  // __APPLE__
-    #warning uncaught_exception not yet implemented
-    printf("uncaught_exception not yet implemented\n");
-    ::abort();
+#   if defined(_MSC_VER) && ! defined(__clang__)
+        _LIBCPP_WARNING("uncaught_exception not yet implemented")
+#   else
+#       warning uncaught_exception not yet implemented
+#   endif
+    _libcpp_abort("uncaught_exception not yet implemented\n");
 #endif  // __APPLE__
 }
 
+
 #ifndef _LIBCPPABI_VERSION
 
 exception::~exception() _NOEXCEPT
@@ -149,9 +160,12 @@
 #if HAVE_DEPENDENT_EH_ABI
     __cxa_decrement_exception_refcount(__ptr_);
 #else
-    #warning exception_ptr not yet implemented
-    printf("exception_ptr not yet implemented\n");
-    ::abort();
+#   if defined(_MSC_VER) && ! defined(__clang__)
+        _LIBCPP_WARNING("exception_ptr not yet implemented")
+#   else
+#       warning exception_ptr not yet implemented
+#   endif
+    _libcpp_abort("exception_ptr not yet implemented\n");
 #endif  // __APPLE__
 }
 
@@ -161,9 +175,14 @@
 #if HAVE_DEPENDENT_EH_ABI
     __cxa_increment_exception_refcount(__ptr_);
 #else
-    #warning exception_ptr not yet implemented
-    printf("exception_ptr not yet implemented\n");
-    ::abort();
+
+#   if defined(_MSC_VER) && ! defined(__clang__)
+        _LIBCPP_WARNING("exception_ptr not yet implemented")
+#   else
+#       warning exception_ptr not yet implemented
+#   endif
+    _libcpp_abort("exception_ptr not yet implemented\n");
+
 #endif  // __APPLE__
 }
 
@@ -178,9 +197,14 @@
     }
     return *this;
 #else  // __APPLE__
-    #warning exception_ptr not yet implemented
-    printf("exception_ptr not yet implemented\n");
-    ::abort();
+
+#   if defined(_MSC_VER) && ! defined(__clang__)
+        _LIBCPP_WARNING("exception_ptr not yet implemented")
+#   else
+#       warning exception_ptr not yet implemented
+#   endif
+    _libcpp_abort("exception_ptr not yet implemented\n");
+
 #endif  // __APPLE__
 }
 
@@ -213,9 +237,12 @@
     ptr.__ptr_ = __cxa_current_primary_exception();
     return ptr;
 #else  // __APPLE__
-    #warning exception_ptr not yet implemented
-    printf("exception_ptr not yet implemented\n");
-    ::abort();
+#   if defined(_MSC_VER) && ! defined(__clang__)
+        _LIBCPP_WARNING( "exception_ptr not yet implemented" )
+#   else
+#       warning exception_ptr not yet implemented
+#   endif
+    _libcpp_abort("exception_ptr not yet implemented\n");
 #endif  // __APPLE__
 }
 
@@ -227,9 +254,12 @@
     // if p.__ptr_ is NULL, above returns so we terminate
     terminate();
 #else  // __APPLE__
-    #warning exception_ptr not yet implemented
-    printf("exception_ptr not yet implemented\n");
-    ::abort();
+#   if defined(_MSC_VER) && ! defined(__clang__)
+        _LIBCPP_WARNING("exception_ptr not yet implemented")
+#   else
+#       warning exception_ptr not yet implemented
+#   endif
+    _libcpp_abort("exception_ptr not yet implemented\n");
 #endif  // __APPLE__
 }
 } // std
diff --git a/libcxx/src/thread.cpp b/libcxx/src/thread.cpp
index cdfa2fd..338a8a2 100644
--- a/libcxx/src/thread.cpp
+++ b/libcxx/src/thread.cpp
@@ -89,7 +89,11 @@
 #else  // defined(CTL_HW) && defined(HW_NCPU)
     // TODO: grovel through /proc or check cpuid on x86 and similar
     // instructions on other architectures.
-#warning hardware_concurrency not yet implemented
+#   if defined(_MSC_VER) && ! defined(__clang__)
+        _LIBCPP_WARNING("hardware_concurrency not yet implemented")
+#   else
+#       warning hardware_concurrency not yet implemented
+#   endif
     return 0;  // Means not computable [thread.thread.static]
 #endif  // defined(CTL_HW) && defined(HW_NCPU)
 }