https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114968
--- Comment #13 from LIU Hao <lh_mouse at 126 dot com> --- I am using a modified patch: ``` diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 4d6b2b98761..fbd9b4dac2e 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -25799,6 +25799,24 @@ ix86_bitint_type_info (int n, struct bitint_info *info) return true; } +/* Returns modified FUNCTION_TYPE for cdtor callabi. */ +tree +ix86_cxx_adjust_cdtor_callabi_fntype (tree fntype) +{ +fprintf(stderr, "TARGET_64BIT = %d\n", (bool) TARGET_64BIT); +fprintf(stderr, "TARGET_RTD = %d\n", (bool) TARGET_RTD); +fprintf(stderr, "ix86_function_type_abi = %d\n", ix86_function_type_abi (fntype)); + if (TARGET_64BIT + || TARGET_RTD + || ix86_function_type_abi (fntype) != MS_ABI) + return fntype; + /* For 32-bit MS ABI add thiscall attribute. */ + tree attribs = tree_cons (get_identifier ("thiscall"), NULL_TREE, + TYPE_ATTRIBUTES (fntype)); +fprintf(stderr, "__thiscall applied!\n"); + return build_type_attribute_variant (fntype, attribs); +} + /* Implement PUSH_ROUNDING. On 386, we have pushw instruction that decrements by exactly 2 no matter what the position was, there is no pushb. ``` There is no message when compiling the testcase: ``` E:\lh_mouse\Desktop>g++ test.cc -Wall -Wextra <built-in>: error: conflicting declaration of C function 'int __cxxabiv1::__cxa_thread_atexit(void (*)(), void*, void*)' test.cc:3:16: note: previous declaration 'int __cxxabiv1::__cxa_thread_atexit(void (__attribute__((thiscall)) *)(void*), void*, void*)' 3 | extern "C" int __cxa_thread_atexit(void (__thiscall* dtor)(void*), void* obj, void* dso) noexcept; | ^~~~~~~~~~~~~~~~~~~ ``` So I suspect this is a wrong place to look at.. ?