jyknight wrote: So, this is interesting, because the decls _already_ don't conflict, normally. They only conflict if the x86intrin.h is included within a `extern "C++" {}` block, _and_ is included after windows.h.
It comes down to, effectively this. Note, run the examples with `-fms-extensions` (or a windows target), because that suppresses err_static_non_static. ```c++ static void _m_prefetchw() {} // from prfchwintrin.h extern "C" { void _m_prefetchw(); } // from winnt.h ``` Notably, surrounding the first in extern "C++" still doesn't trigger an error: ```c++ extern "C++" { static void _m_prefetchw() {} } extern "C" { void _m_prefetchw(); } ``` even though it would've if the declaration didn't say "static": ```c++ extern "C++" { void _m_prefetchw() {} } extern "C" { void _m_prefetchw(); } // error ``` Which I guess means Clang decides language-linkage doesn't really matter for internal linkage functions? I haven't traced where in the code that happens, but it seems vaguely sensible. Yet, _reversing_ the order: ```c++ extern "C" { void _m_prefetchw(); } extern "C++" { static void _m_prefetchw() {} } ``` does throw an "error: declaration of '_m_prefetchw' has a different language linkage" on the second line.. If language-linkage doesn't matter for static functions (seems sensible), I think we probably also shouldn't throw an error for that last case. And, if we did stop throwing that error, the incompatibility here disappears, and this PR is unnecessary. https://github.com/llvm/llvm-project/pull/115099 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits