Hi, so as no other review happend, I changed patch as you suggested.
Tested for i686-w64-mingw32, and regression tested for x86_64-unknown-linux-gnu. Ok for apply? Regards, Kai ChangeLog 2011-12-12 Kai Tietz <kti...@redhat.com> PR libstdc++/511135 * libsupc++/cxxabi.h (__cxxabi_dtor_type): New type. (__cxa_throw): Use it for destructor-argument. * eh_throw.cc (__cxa_throw): Likewise. * unwind-cxx.h (__cxa_exception): Change type of member exceptionDestructor to __cxxabi_dtor_type. Index: gcc/libstdc++-v3/libsupc++/cxxabi.h =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/cxxabi.h +++ gcc/libstdc++-v3/libsupc++/cxxabi.h @@ -51,6 +51,16 @@ #include <bits/cxxabi_tweaks.h> #include <bits/cxxabi_forced.h> +// On 32-bit IA native windows target is the used calling-convention +// for class-member-functions of kind __thiscall. As destructor is +// also of kind class-member-function, we need to specify for this +// target proper calling-convention on destructor-function-pointer. +#if defined (__MINGW32__) && defined (__i386__) +typedef void (__thiscall *__cxxabi_dtor_type) (void *); +#else +typedef void (*__cxxabi_dtor_type) (void *); +#endif + #ifdef __cplusplus namespace __cxxabiv1 { @@ -596,7 +606,7 @@ namespace __cxxabiv1 // Throw the exception. void - __cxa_throw(void*, std::type_info*, void (*) (void *)) + __cxa_throw(void*, std::type_info*, __cxxabi_dtor_type) __attribute__((__noreturn__)); // Used to implement exception handlers. Index: gcc/libstdc++-v3/libsupc++/eh_throw.cc =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/eh_throw.cc +++ gcc/libstdc++-v3/libsupc++/eh_throw.cc @@ -58,8 +58,8 @@ __gxx_exception_cleanup (_Unwind_Reason_ extern "C" void -__cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, - void (*dest) (void *)) +__cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, + __cxxabi_dtor_type dest) { // Definitely a primary. __cxa_refcounted_exception *header Index: gcc/libstdc++-v3/libsupc++/unwind-cxx.h =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/unwind-cxx.h +++ gcc/libstdc++-v3/libsupc++/unwind-cxx.h @@ -51,7 +51,7 @@ struct __cxa_exception { // Manage the exception object itself. std::type_info *exceptionType; - void (*exceptionDestructor)(void *); + __cxxabi_dtor_type exceptionDestructor; // The C++ standard has entertaining rules wrt calling set_terminate // and set_unexpected in the middle of the exception cleanup process.