Opened 9 years ago
Closed 9 years ago
#9694 closed Bugs (fixed)
boost/thread.hpp doesn't compile with MinGW and -march=pentium3
| Reported by: | Owned by: | Peter Dimov | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | smart_ptr |
| Version: | Boost 1.55.0 | Severity: | Regression |
| Keywords: | Cc: |
Description
I get the same with two 32-bit MinGW-w64 versions: from g++ 4.8.2 from MSYS2 and g++ 4.8.1 from mingw-builds. This problem doesn't exist in boost 1.53.
$ cat test.cpp
#include <boost/thread.hpp>
$ /mingw32/bin/g++ -I./checkout/boost_1_55_0 -march=pentium3 -c test.cpp
In file included from C:/msys64/mingw32/i686-w64-mingw32/include/intrin.h:151:0,
from ./checkout/boost_1_55_0/boost/detail/interlocked.hpp:146,
from ./checkout/boost_1_55_0/boost/thread/win32/thread_primitives.hpp:17,
from ./checkout/boost_1_55_0/boost/thread/win32/thread_data.hpp:11,
from ./checkout/boost_1_55_0/boost/thread/thread_only.hpp:15,
from ./checkout/boost_1_55_0/boost/thread/thread.hpp:12,
from ./checkout/boost_1_55_0/boost/thread.hpp:13,
from test.cpp:1:
C:/msys64/mingw32/i686-w64-mingw32/include/dvec.h: In function 'const __m128i get_mask128()':
C:/msys64/mingw32/i686-w64-mingw32/include/dvec.h:56:83: error: '_mm_set1_epi64' was not declared in this scope
static const __m128i mask128 = _mm_set1_epi64(M64((__int64)0xffffffffffffffffll));
^
C:/msys64/mingw32/i686-w64-mingw32/include/dvec.h: In member function 'M128& M128::operator&=(const M128&)':
C:/msys64/mingw32/i686-w64-mingw32/include/dvec.h:71:78: error: '_mm_and_si128' was not declared in this scope
M128& operator&=(const M128 &a) { return *this = (M128) _mm_and_si128(vec,a); }
Googling around I've found the same error message here: http://pastebin.com/4nXK0V73
Change History (4)
comment:1 by , 9 years ago
| Component: | thread → smart_ptr |
|---|---|
| Owner: | changed from to |
comment:2 by , 9 years ago
This should be reported as a MinGW bug - their <intrin.h> header doesn't compile under -march=pentium3.
To get around this issue, try defining BOOST_USE_WINDOWS_H. This will force interlocked.hpp to include windows.h instead of intrin.h.
comment:3 by , 9 years ago
thanks for looking into it
I reported it to Mingw-w64 then https://sourceforge.net/p/mingw-w64/bugs/383/
I'd close this ticket, but apparently I don't have permissions to do it.

I'm not the owner of boost/detail/interlocked.hpp. Moving to SmartPtr in case Peter Dimov is aware of the issue.