http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56038
Bug #: 56038 Summary: declarations in xmmintrin.h conflict with mingw-w64 intrin.h in c++ mode Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: erik-gcc-bugzi...@vanpienbroek.nl CC: ktiet...@googlemail.com Target: i686-w64-mingw32 Build: gcc 4.8 20130106 snapshot, r194954 While testing gcc 4.8 (for the target i686-w64-mingw32) I stumbled across a compile failure while trying to build Qt5. Here's a minimal testcase to reproduce this compile failure: #include <algorithm> #include <intrin.h> int main() { return 0; } When trying to build this with gcc 4.8 and a recent mingw-w64 trunk snapshot the following error occurs: $ i686-w64-mingw32-g++ -O2 -msse2 -std=c++11 test.cpp In file included from /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/x86intrin.h:34:0, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/opt_random.h:33, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/random:51, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/stl_algo.h:67, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/algorithm:63, from test.cpp:1: /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/xmmintrin.h:997:1: error: previous declaration of 'int _m_pextrw(__m64, int)' with 'C++' linkage _m_pextrw (__m64 const __A, int const __N) ^ In file included from test.cpp:2:0: /usr/i686-w64-mingw32/sys-root/mingw/include/intrin.h:561:5: error: conflicts with new declaration with 'C' linkage __MACHINEX86X_NOX64(int _m_pextrw(__m64,int)) ^ In file included from /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/x86intrin.h:34:0, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/opt_random.h:33, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/random:51, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/stl_algo.h:67, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/algorithm:63, from test.cpp:1: /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/xmmintrin.h:1018:1: error: previous declaration of '__m64 _m_pinsrw(__m64, int, int)' with 'C++' linkage _m_pinsrw (__m64 const __A, int const __D, int const __N) ^ In file included from test.cpp:2:0: /usr/i686-w64-mingw32/sys-root/mingw/include/intrin.h:566:5: error: conflicts with new declaration with 'C' linkage __MACHINEX86X_NOX64(__m64 _m_pinsrw(__m64,int,int)) ^ In file included from /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/x86intrin.h:34:0, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/opt_random.h:33, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/random:51, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/stl_algo.h:67, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/algorithm:63, from test.cpp:1: /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/xmmintrin.h:1119:1: error: previous declaration of '__m64 _m_pshufw(__m64, int)' with 'C++' linkage _m_pshufw (__m64 __A, int const __N) ^ In file included from test.cpp:2:0: /usr/i686-w64-mingw32/sys-root/mingw/include/intrin.h:578:5: error: conflicts with new declaration with 'C' linkage __MACHINEX86X_NOX64(__m64 _m_pshufw(__m64,int)) ^ In file included from /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/x86intrin.h:34:0, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/opt_random.h:33, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/random:51, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/bits/stl_algo.h:67, from /usr/i686-w64-mingw32/sys-root/mingw/include/c++/algorithm:63, from test.cpp:1: /usr/lib64/gcc/i686-w64-mingw32/4.8.0/include/xmmintrin.h:716:1: error: previous declaration of '__m128 _mm_shuffle_ps(__m128, __m128, int)' with 'C++' linkage _mm_shuffle_ps (__m128 __A, __m128 __B, int const __mask) ^ In file included from test.cpp:2:0: /usr/i686-w64-mingw32/sys-root/mingw/include/intrin.h:656:5: error: conflicts with new declaration with 'C' linkage __MACHINEX86X_NOIA64(__m128 _mm_shuffle_ps(__m128,__m128,int const)) ^ The above testcase built fine with gcc 4.7 and the exact same version of mingw-w64, so I consider this a regression in gcc 4.8 With the (pretty straightforward) change below I managed to resolve the issue: --- gcc/config/i386/xmmintrin.h.orig 2013-01-18 14:57:27.762645582 +0100 +++ gcc/config/i386/xmmintrin.h 2013-01-18 14:58:27.604561940 +0100 @@ -37,6 +37,10 @@ /* Get _mm_malloc () and _mm_free (). */ #include <mm_malloc.h> +#ifdef __cplusplus +extern "C" { +#endif + /* The Intel API is flexible enough that we must allow aliasing with other vector types, and their scalar components. */ typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); @@ -1241,6 +1245,10 @@ (row3) = __builtin_ia32_movhlps (__t3, __t2); \ } while (0) +#ifdef __cplusplus +} +#endif + /* For backward source compatibility. */ #ifdef __SSE2__ # include <emmintrin.h> I don't know if this change is the correct fix, but it resolves the qt5 build failure for me.