[libc++] Don't define exception destructors when using vcruntime

Exception destructors are provided by vcruntime.  Fixes link errors like:

    lld-link: error: duplicate symbol: "public: virtual __cdecl std::invalid_argument::~invalid_argument(void)" (??1invalid_argument@std@@UEAA@XZ) in stdexcept.obj and in libcpmt.lib(xthrow.obj)
    lld-link: error: duplicate symbol: "public: virtual __cdecl std::length_error::~length_error(void)" (??1length_error@std@@UEAA@XZ) in stdexcept.obj and in libcpmt.lib(xthrow.obj)
    lld-link: error: duplicate symbol: "public: virtual __cdecl std::out_of_range::~out_of_range(void)" (??1out_of_range@std@@UEAA@XZ) in stdexcept.obj and in libcpmt.lib(xthrow.obj)
    lld-link: error: duplicate symbol: "public: virtual __cdecl std::overflow_error::~overflow_error(void)" (??1overflow_error@std@@UEAA@XZ) in stdexcept.obj and in libcpmt.lib(xthrow.obj)

Differential Revision: https://reviews.llvm.org/D57425

llvm-svn: 352646
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 095ed0554f9121a726b306f6ceb5bf3cf65f21e5
diff --git a/src/stdexcept.cpp b/src/stdexcept.cpp
index 6ae35fe..179c250 100644
--- a/src/stdexcept.cpp
+++ b/src/stdexcept.cpp
@@ -43,20 +43,6 @@
     return *this;
 }
 
-#if !defined(_LIBCPPABI_VERSION) && !defined(LIBSTDCXX)
-
-logic_error::~logic_error() _NOEXCEPT
-{
-}
-
-const char*
-logic_error::what() const _NOEXCEPT
-{
-    return __imp_.c_str();
-}
-
-#endif
-
 runtime_error::runtime_error(const string& msg) : __imp_(msg.c_str())
 {
 }
@@ -79,8 +65,10 @@
 
 #if !defined(_LIBCPPABI_VERSION) && !defined(LIBSTDCXX)
 
-runtime_error::~runtime_error() _NOEXCEPT
+const char*
+logic_error::what() const _NOEXCEPT
 {
+    return __imp_.c_str();
 }
 
 const char*
@@ -89,15 +77,20 @@
     return __imp_.c_str();
 }
 
+#if !defined(_LIBCPP_ABI_MICROSOFT) || defined(_LIBCPP_NO_VCRUNTIME)
+
+logic_error::~logic_error() _NOEXCEPT {}
 domain_error::~domain_error() _NOEXCEPT {}
 invalid_argument::~invalid_argument() _NOEXCEPT {}
 length_error::~length_error() _NOEXCEPT {}
 out_of_range::~out_of_range() _NOEXCEPT {}
 
+runtime_error::~runtime_error() _NOEXCEPT {}
 range_error::~range_error() _NOEXCEPT {}
 overflow_error::~overflow_error() _NOEXCEPT {}
 underflow_error::~underflow_error() _NOEXCEPT {}
 
 #endif
+#endif
 
 }  // std