|
Boost Users : |
Subject: Re: [Boost-users] Weird code in lockfree::queue::reserve (compilation error)
From: Aurelien Regat-Barrel (arb_at_[hidden])
Date: 2016-04-02 19:40:46
Hello,
> What error are you getting?
VC++ 2015 emits a syntax error:
void f() {
boost::lockfree::queue<int*, boost::lockfree::fixed_sized<true>> queue;
queue.reserve(10);
}
1>boost\lockfree\queue.hpp(226): error C2059: syntax error: 'template'
I figured out this is because of the "boost::lockfree::fixed_sized<true>" option. If I removed it, it compiles fine. So I managed to set the size of my queue at construction time.
Do you think it would be possible to improve the error message?
=== Bonus! ===
I was using VC++ 2015 Update 1, and I just updated to Update 2... and I get another error from std::atomic:
#ifndef _ENABLE_ATOMIC_ALIGNMENT_FIX
static_assert(alignof(_Ty) >= alignof(_My_int),
"You've instantiated std::atomic<T> with sizeof(T) equal to 2/4/8 and alignof(T) < sizeof(T). "
"Before VS 2015 Update 2, this would have misbehaved at runtime. "
"VS 2015 Update 2 was fixed to handle this correctly, "
"but the fix inherently changes layout and breaks binary compatibility. "
"Please define _ENABLE_ATOMIC_ALIGNMENT_FIX to acknowledge that you understand this, "
"and that everything you're linking has been compiled with VS 2015 Update 2 (or later).");
#endif /* _ENABLE_ATOMIC_ALIGNMENT_FIX */
This is caused by the following code in boost\lockfree\detail\freelist.hpp(603):
std::atomic<boost::lockfree::detail::tagged_index> pool_;
with sizeof(tagged_index) == 4 and alignof(tagged_index) == 2.
It can be fixed by changing tagged_index to be alignas(4), or by defining _ENABLE_ATOMIC_ALIGNMENT_FIX:
#if _MSC_FULL_VER == 190023918 // VC++ 2015 Update 2
#define _ENABLE_ATOMIC_ALIGNMENT_FIX
#endif
Since there's a compiler bug prior to Update 2 (https://connect.microsoft.com/VisualStudio/feedback/details/1892487/code-generated-by-msvc-doesnt-operate-atomically-on-std-atomic-t-object-when-sizeof-t-n-alignof-t-n-n-2-4-8), may be the source should be updated to not compile if the code generated by VC++ is not reliable?
Regards,
Aurélien Regat-Barrel
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net