Hi mclow.lists, EricWF,

MS CRT provides implementation of those handler functions, defer to them.

http://reviews.llvm.org/D5131

Files:
  src/exception.cpp
  test/depr/exception.unexpected/set.unexpected/get_unexpected.pass.cpp
Index: src/exception.cpp
===================================================================
--- src/exception.cpp
+++ src/exception.cpp
@@ -29,6 +29,8 @@
     #define __terminate_handler  __cxxabiapple::__cxa_terminate_handler
     #define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler
   #endif  // _LIBCPPABI_VERSION
+#elif defined(_LIBCPP_MSVCRT)
+  #include <eh.h>
 #elif defined(LIBCXXRT) || __has_include(<cxxabi.h>)
   #include <cxxabi.h>
   using namespace __cxxabiv1;
@@ -49,41 +51,62 @@
 unexpected_handler
 set_unexpected(unexpected_handler func) _NOEXCEPT
 {
+#ifndef _LIBCPP_MSVCRT
     return __sync_lock_test_and_set(&__unexpected_handler, func);
+#else
+    return ::set_unexpected(func);
+#endif  // !_LIBCPP_MSVCRT
 }
 
 unexpected_handler
 get_unexpected() _NOEXCEPT
 {
+#ifndef _LIBCPP_MSVCRT
     return __sync_fetch_and_add(&__unexpected_handler, (unexpected_handler)0);
+#else
+    return ::_get_unexpected();
+#endif  // !_LIBCPP_MSVCRT
 }
 
 _LIBCPP_NORETURN
 void
 unexpected()
 {
+#ifndef _LIBCPP_MSVCRT
     (*get_unexpected())();
     // unexpected handler should not return
     terminate();
+#else
+    return ::unexpected();
+#endif  // !_LIBCPP_MSVCRT
 }
 
 terminate_handler
 set_terminate(terminate_handler func) _NOEXCEPT
 {
+#ifndef _LIBCPP_MSVCRT
     return __sync_lock_test_and_set(&__terminate_handler, func);
+#else
+    return ::set_terminate(func);
+#endif  // !_LIBCPP_MSVCRT
 }
 
 terminate_handler
 get_terminate() _NOEXCEPT
 {
+#ifndef _LIBCPP_MSVCRT
     return __sync_fetch_and_add(&__terminate_handler, (terminate_handler)0);
+#else
+    return ::_get_terminate();
+#endif  // !_LIBCPP_MSVCRT
 }
 
 #ifndef __EMSCRIPTEN__ // We provide this in JS
 _LIBCPP_NORETURN
 void
 terminate() _NOEXCEPT
 {
+#ifndef _LIBCPP_MSVCRT
 #ifndef _LIBCPP_NO_EXCEPTIONS
     try
     {
@@ -101,17 +124,22 @@
         ::abort();
     }
 #endif  // _LIBCPP_NO_EXCEPTIONS
+#else
+    return ::terminate();
+#endif  // !_LIBCPP_MSVCRT
 }
 #endif // !__EMSCRIPTEN__
-#endif // !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION)
+#endif // !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
 
 #if !defined(LIBCXXRT) && !defined(__GLIBCXX__) && !defined(__EMSCRIPTEN__)
 bool uncaught_exception() _NOEXCEPT
 {
 #if defined(__APPLE__) || defined(_LIBCPPABI_VERSION)
     // on Darwin, there is a helper function so __cxa_get_globals is private
     return __cxa_uncaught_exception();
-#else  // __APPLE__
+#elif defined(_LIBCPP_MSVCRT)
+    return ::__uncaught_exception();
+#else
 #   if defined(_MSC_VER) && ! defined(__clang__)
         _LIBCPP_WARNING("uncaught_exception not yet implemented")
 #   else
@@ -135,7 +163,7 @@
 }
 
 #endif  // _LIBCPPABI_VERSION
-#endif //LIBCXXRT
+#endif // !defined(LIBCXXRT) && !defined(__GLIBCXX__) && !defined(__EMSCRIPTEN__)
 #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
 
 bad_exception::~bad_exception() _NOEXCEPT
Index: test/depr/exception.unexpected/set.unexpected/get_unexpected.pass.cpp
===================================================================
--- test/depr/exception.unexpected/set.unexpected/get_unexpected.pass.cpp
+++ test/depr/exception.unexpected/set.unexpected/get_unexpected.pass.cpp
@@ -7,6 +7,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+// msvcrt default unexpected handler is null
+// XFAIL: win32
+
 // test get_unexpected
 
 #include <exception>
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to