diff --git a/libcxxabi/include/__cxxabi_config.h b/libcxxabi/include/__cxxabi_config.h --- a/libcxxabi/include/__cxxabi_config.h +++ b/libcxxabi/include/__cxxabi_config.h @@ -97,4 +97,10 @@ # define _LIBCXXABI_NO_EXCEPTIONS #endif +#if defined(_WIN32) +#define _LIBCXXABI_DTOR_FUNC __thiscall +#else +#define _LIBCXXABI_DTOR_FUNC +#endif + #endif // ____CXXABI_CONFIG_H diff --git a/libcxxabi/include/cxxabi.h b/libcxxabi/include/cxxabi.h --- a/libcxxabi/include/cxxabi.h +++ b/libcxxabi/include/cxxabi.h @@ -47,7 +47,7 @@ // 2.4.3 Throwing the Exception Object extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_throw(void *thrown_exception, std::type_info *tinfo, - void (*dest)(void *)); + void (_LIBCXXABI_DTOR_FUNC *dest)(void *)); // 2.5.3 Exception Handlers extern _LIBCXXABI_FUNC_VIS void * diff --git a/libcxxabi/src/cxa_exception.h b/libcxxabi/src/cxa_exception.h --- a/libcxxabi/src/cxa_exception.h +++ b/libcxxabi/src/cxa_exception.h @@ -43,7 +43,7 @@ // Manage the exception object itself. std::type_info *exceptionType; - void (*exceptionDestructor)(void *); + void (_LIBCXXABI_DTOR_FUNC *exceptionDestructor)(void *); std::unexpected_handler unexpectedHandler; std::terminate_handler terminateHandler; @@ -81,7 +81,7 @@ #endif std::type_info *exceptionType; - void (*exceptionDestructor)(void *); + void (_LIBCXXABI_DTOR_FUNC *exceptionDestructor)(void *); std::unexpected_handler unexpectedHandler; std::terminate_handler terminateHandler; diff --git a/libcxxabi/src/cxa_exception.cpp b/libcxxabi/src/cxa_exception.cpp --- a/libcxxabi/src/cxa_exception.cpp +++ b/libcxxabi/src/cxa_exception.cpp @@ -254,7 +254,7 @@ exception. */ void -__cxa_throw(void *thrown_object, std::type_info *tinfo, void (*dest)(void *)) { +__cxa_throw(void *thrown_object, std::type_info *tinfo, void (_LIBCXXABI_DTOR_FUNC *dest)(void *)) { __cxa_eh_globals *globals = __cxa_get_globals(); __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object);